2012-11-10 39 views
5

Trong ứng dụng dựa trên Backbone.js của tôi Tôi đang nói chuyện với API của tôi phản hồi trạng thái 204 và một phần trống, trong trường hợp yêu cầu thu thập không chứa bất kỳ dữ liệu nào. Đó là quan điểm của tôi như thế nào một RESTful API nên trả lời trong trường hợp như vậy.Cách xử lý phản hồi 204 trong yêu cầu thu thập Backbone.js

Trong ứng dụng của tôi bây giờ tôi có vấn đề, rõ ràng là không có sự kiện nào được kích hoạt sau khi nhận được phản hồi 204. Tôi đã cố gắng ràng buộc resetall như:

FoosCollectionView.prototype.initialize = function() { 
    this.collection = new FoosCollection; 
    this.collection.bind('reset', this.render, this); 
    this.collection.bind('all', this.render, this); 
    return this.collection.fetch(); 
    }; 

nhưng các sự kiện không bao giờ kích hoạt. Vì vậy, tôi đã cố gắng tìm nạp một số cuộc gọi lại:

FoosCollectionView.prototype.initialize = function() { 
    this.collection = new FoosCollection(); 
    return this.collection.fetch({ 
     success: function(a, b, c) { 
     debugger; 
     }, 
     error: function(a, b, c) { 
     debugger; 
     }, 
     complete: function(a, b) { 
     debugger; 
     } 
    }); 
    }; 

Hành vi tương tự. Không có câu lệnh gỡ rối nào đạt được trong trường hợp phản hồi là 204. Làm thế nào tôi có thể xử lý 204 câu trả lời sau đó? Tôi sẽ phải đào sâu vào sync và thêm một xử lý bổ sung cho 204 có hoặc có một cái gì đó trong xương sống mà tôi chỉ đơn giản là không biết chưa?

Thx Felix

+0

Theo như tôi phát hiện ra, tôi có thể thêm một số đăng nhập vào bộ sưu tập phân tích phương pháp. Nhưng việc xử lý hiển thị chế độ xem 'không có nội dung' từ đó có vẻ xấu xí. – GeorgieF

+2

Tôi đã tìm thấy một giải pháp có vẻ ít thanh lịch hơn một chút. Tôi xác định phân tích trong bộ sưu tập của tôi. Bên trong tôi kiểm tra xem phản ứng đã cho có trống không. Nếu vậy, tôi đặt các mô hình bộ sưu tập thành [] để kích hoạt sự kiện đặt lại. Chế độ xem bộ sưu tập được ràng buộc với sự kiện đó và sau đó có thể hiển thị một số mẫu "không có nội dung ở đây". – GeorgieF

Trả lời

0

Các giải pháp có vẻ khá về phía trước và vụng về cùng một lúc:

tôi chỉ cần xác định các phương pháp parse trong bộ sưu tập của tôi để nó kiểm tra, cho dù đối tượng response qua trống. Đó chỉ là trường hợp khi một 204 xảy ra. Sau đó, bên trong parse Tôi đặt this.collection.models = [] kích hoạt sự kiện reset. Khung nhìn bộ sưu tập được ràng buộc với sự kiện đó, chạy một hàm có thể có một cái nhìn bên trong this.collection.models. Trong trường hợp không có mô hình nào được cung cấp, mẫu 'không có nội dung' có thể được hiển thị thay vì mẫu chuẩn.

Nếu ai đó có cách tiếp cận tốt hơn, tôi đánh giá cao ở đây!

0

Backbone.js kết thúc các phản hồi đó thành bộ sưu tập trống. Tôi đang sử dụng này như workaround.

render: function(){ 
    if (this.collection.length == 0) { 
     console.log('empty response'); 
     // initialize with default values 
     this.collection.reset(data); 
    } 
    // do usual stuff 
} 
0

Vấn đề tương tự đã xảy ra hôm nay và nói từ kết luận, mã của tôi sai. Sau khi sửa đổi mã, success() gọi lại được gọi khi máy chủ phản hồi với 204 No Content.

Backbone: 1.2.3
jQuery: 2.1.4

sai mã:

FooCollection = Backbone.Collection.extend({ 
    url: '/foo', 

    model: FooModel, 

    fetch: function (options) { 

    // do something. 

    // Actually, you should call `Backbone.Collection.prototype.fetch()`. 
    return Backbone.Model.prototype.fetch.call(this, options); 
    } 
}); 

Vì vậy, nếu bạn gặp vấn đề này, bạn nên kiểm tra nếu có bất kỳ lỗi trong mã. Dù sao, nếu bạn muốn xử lý các phản ứng 204 No Content, có phương pháp sau đây. (không khuyến khích)

initialize: function() { 
    this.collection = new FooCollection(); 

    var _this = this; 
    this.collection.fetch({ 
     success: function (collection, response, options) { 
     }, 
     error: function (collection, response, options) { 
     } 
    }).done(function (data, textStatus, jqXHR) { 
     if (jqXHR.status === 204) { 
     // do something. 
     // e.g. _this.collection.reset(); 
     } 
    }); 
    } 
Các vấn đề liên quan