Backbone.js 等待集合获取主干中的所有内容
我有两套藏品。一个用于类别,另一个用于项目。我需要等待类别完成获取所有内容,以便为要获取的项目设置类别 此外,每次单击某个类别时,我都必须重新获取一个新的项目集合,因为每次单击某个类别时,我都会进行分页,但它不会刷新或重新获取集合,因此分页代码会与错误的集合混淆。有什么想法吗Backbone.js 等待集合获取主干中的所有内容,backbone.js,Backbone.js,我有两套藏品。一个用于类别,另一个用于项目。我需要等待类别完成获取所有内容,以便为要获取的项目设置类别 此外,每次单击某个类别时,我都必须重新获取一个新的项目集合,因为每次单击某个类别时,我都会进行分页,但它不会刷新或重新获取集合,因此分页代码会与错误的集合混淆。有什么想法吗 this.categoryCollection = new CategoryCollection(); this.categoryCollection.fetch(); this.itemCollection = new
this.categoryCollection = new CategoryCollection();
this.categoryCollection.fetch();
this.itemCollection = new ItemCollection();
this.itemCollection.fetch();
一种快速的方法是将回调传递到调用第二个调用的第一个
fetch()
调用中fetch()
var self = this;
this.categoryCollection = new CategoryCollection();
this.categoryCollection.fetch({
success: function () {
self.itemCollection = new ItemCollection();
self.itemCollection.fetch();
}
});
虽然不是最优雅的,但它很管用。由于fetch()
返回由发生的$.ajax
调用创建的jQuery deferred,因此您可能可以对deferred做一些创造性的工作
对于分页问题,如果看不到分页代码在做什么,很难判断。您将不得不自己滚动分页内容,因为主干本身不支持它。我可能要做的是为正在查询的页面条件创建一个新集合,并可能创建一个支持分页的服务器操作(将集合的url
映射到分页的服务器操作)。不过,我并没有对此做太多考虑。我正在使用RelationalModel,我创建了一个排队获取,它只在加载完成时调用“更改”事件:
var MySuperClass = Backbone.RelationalModel.extend({
//...
_fetchQueue : [],
fetchQueueingChange : function(name){
//Add property to the queue
this._fetchQueue.push(name);
var me = this;
//On fetch finished, remove it
var oncomplete = function(model, response){
//From _fetchQueue remove 'name'
var i = me._fetchQueue.indexOf(name);
me._fetchQueue.splice(i, 1);
//If done, trigger change
if (me._fetchQueue.length == 0){
me.trigger('change');
}
};
this.get(name).fetch({
success: oncomplete,
error : oncomplete
});
},
//...
});
该类将调用:
this.fetchQueueingChange('categories');
this.fetchQueueingChange('items');
我希望您能在这方面有所改进,它对我很有效。只需将jQuery设置为同步即可
$.ajaxSetup({
async: false
});
this.categoryCollection.fetch();
this.itemCollection.fetch();
$.ajaxSetup({
async: true
});
我想这是最简单的解决办法。当然,在这些回迁运行时启动新请求也将作为同步启动,这可能是您不喜欢的。刚刚遇到了类似的情况。最后,我将jquery.ajax参数传递给fetch()调用。您可以使第一次获取同步。从:
ajax选项也可以作为获取选项直接传递
您的代码可以简化为:
this.categoryCollection.fetch({async:false});
this.itemCollection.fetch();
我今天也遇到了同样的问题,并找到了解决方案:
var self = this;
this.collection = new WineCollection();
this.collection.url = ApiConfig.winetards.getWineList;
this.collection.on("reset", function(){self.render()});
this.collection.fetch({reset: true});
现在,当集合上的获取完成时,将触发“重置”,并在“重置”时调用视图的render()方法
使用{async:false}
不是处理主干的fetch()的理想方法 我不得不对这条线索做出反应,因为那里有答案
这是唯一正确的方法!!!
通过这样做,您可以同时获取两个集合,并且可以在两个集合都准备好时生成事件。因此,您不必等待完成加载第一个集合以获取其他集合,您也不会进行ajax调用同步等,您可以在其他答案中看到这一点强>
这里有一个医生
注意:在本例中,当一个或多个延迟对象失败时,不包括它。如果您想在.done
旁边讨论该情况,则必须在上添加.fail
回调。when
并添加error
处理程序,该处理程序将在本例中标记失败的d1或d2。全局禁用异步调用不是一个好的做法。您只需使用this.categoryCollection.fetch({async:false})代码>我想知道,如果他包括一个预防措施,它将被升级而不是这不是一个好主意,因为它可能会导致浏览器锁定,而一切都在等待同步调用完成。直接从文档中可以看出:“请注意,同步请求可能会暂时锁定浏览器,从而在请求处于活动状态时禁用任何操作。从jQuery 1.8开始,在jqXHR($.Deferred)中使用async:false已弃用;您必须使用success/error/complete回调选项,而不是jqXHR对象的相应方法,如jqXHR.done()或弃用的jqXHR.success()。“[使用Async:false不是一个好主意。在使用SPA时,我认为这没有任何意义。这对我来说非常有用。我尝试使用fetch()使用async并以串联方式运行进程,但fetch()的成功回调在同步完成之前触发。还应注意,这种方法已被弃用。请参阅帖子:我添加了一种正确的方法来执行此操作。这不是一种一个接一个地进行调用的方法!!!使用延迟对象执行此操作的唯一正确方法:无需叫喊。
this.categoryCollection = new CategoryCollection();
this.itemCollection = new ItemCollection();
var d1 = this.categoryCollection.fetch();
var d2 = this.itemCollection.fetch();
jQuery.when(d1, d2).done(function () {
// moment when both collections are populated
alert('YOUR COLLECTIONS ARE LOADED :)');
});