phi*_*ilm 5 javascript jquery backbone.js jquery-deferred
我希望能够使用jQuery的Deferred对象来操作通过Backbone Collections和Models加载数据.有没有什么办法可以修改提供给完成和失败回调的参数来包含Model或Collection实例?我想象的是以下内容:
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
});
Run Code Online (Sandbox Code Playgroud)
当然,由于filter返回一个数组,因此使用数组而不是枚举参数调用done回调.据我所知,管道只能修改提供的参数,而不是添加.任何建议,将不胜感激.
编辑:这是一个非常简化的例子; 因为在原始集合上创建了一个闭包,所以我可以对它进行操作.但是,用例是多个Backbone Views可能依赖于被提取的相同数据,因此我希望能够将jQuery Deferred对象提供给这些视图,而不是Deferred和collection实例.
另一个编辑:在下面发布解决方案,但欢迎任何其他建议.
我发现我可以通过让 .pipe 方法返回一个新的 $.Deferred 来完成此任务,该新的 $.Deferred 可以使用修改后的参数立即解析:
var _sync = Backbone.sync;
Backbone.sync = function() {
var jqXhr = _sync.apply(this, arguments);
var self = this;
var deferred = jqXhr.pipe(function() {
var cbArgs = [self];
cbArgs.push.apply(cbArgs, arguments);
var deferred = new $.Deferred();
return deferred.resolve.apply(deferred, cbArgs);
});
return $.extend(true, jqXhr, deferred);
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
751 次 |
| 最近记录: |