Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 等待集合获取主干中的所有内容_Backbone.js - Fatal编程技术网

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 :)'); 
});