Tôi muốn có thể sử dụng đối tượng Trì hoãn của jQuery để vận hành dữ liệu tải thông qua Bộ sưu tập và Mô hình Backbone. Có cách nào tôi có thể sửa đổi các đối số được cung cấp cho các callbacks đã thực hiện và không thành công để bao gồm cá thể Model hoặc Collection không? Tôi đang hình dung một cái gì đó như sau:Tôi có thể sử dụng phương thức deferred.pipe của jQuery để sửa đổi các đối số được cung cấp cho các cuộc gọi lại không giải quyết/thất bại không?
var _sync = Backbone.sync;
Backbone.sync = function() {
var jqXhr = _sync.apply(this, arguments);
var self = this;
return jqXhr.pipe(function() {
var cbArgs = [self];
cbArgs.push.apply(cbArgs, arguments);
return cbArgs;
}
}
...
var c = new Backbone.Collection();
c.url = "/path/to/resources";
c.fetch().then(function(collection, data, textStatus, jqXhr) {
// do stuff with collection
});
Tất nhiên, vì bộ lọc trả về một mảng, gọi lại được thực hiện với một mảng chứ không phải đối số được liệt kê. Theo như tôi thấy, đường ống chỉ có thể sửa đổi các đối số được cung cấp, chứ không phải thêm. Mọi lơi đê nghị đêu nên được đanh gia cao.
Chỉnh sửa: Đây là một ví dụ rất đơn giản; kể từ khi một đóng cửa được tạo ra trên bộ sưu tập ban đầu, tôi chỉ có thể hoạt động trên đó. Tuy nhiên, trường hợp sử dụng là nhiều khung nhìn Backbone có thể dựa vào cùng một dữ liệu đang được tìm nạp, vì vậy tôi muốn có thể chỉ cung cấp đối tượng jQuery Deferred cho các khung nhìn này, chứ không phải cả trường hợp hoãn và bộ sưu tập.
Một chỉnh sửa khác: Đăng giải pháp bên dưới nhưng mọi đề xuất khác đều được chào đón.
Edite d để mở rộng jqXhr ban đầu với $ .Deferred mới, duy trì hỗ trợ cho tất cả các phương thức AJAX cụ thể (.success, .abort, v.v.). – philm