使用 Backbone.Collection 获取但值不包括

Using Backbone.Collection fetch but value not including

我认为初始化集合会返回 Backbone.Collection 的现成实例。然而,在获取之后,集合包含一些模型,但在要求中,_this.serviceCollection.toJSON() 给了我未定义的对象。

我的Backbone.Collection:

var ServiceCollection = Backbone.Collection.extend({
    model: Backbone.Model,
    initialize: function(options){
        this.fetch({
            url: 'service/' + options + '/',
            async: false,
            success: function(collection, response, options){
                collection.set(response.result);
            }
        });
    }
});

return ServiceCollection;

我的 CollectionView 显示:

    OpenServices: function(category){
        var _this = this;
        require([
            'service/js/service_collection',
            'service/js/service_collection_view'
        ], function(ServiceCollection, ServiceCollectionView){
            _this.serviceCollection = new ServiceCollection(category);
            _this.serviceCollectionView = new ServiceCollectionView({
                collection: _this.serviceCollection
            });
            _this.categoryLayout.categoryItems.show(_this.serviceCollectionView);
        });
    }

这段代码有什么问题?

我怀疑您遇到的问题与您的 success 回调有关。应该不需要调用 collection.set(...) 来将模型添加到集合中;当 fetch 成功时,自动 为您完成。事实上,the documentation around Collection.set 提供了这个金块:

... if the collection contains any models that aren't present in the list, they'll be removed.

我怀疑您的成功回调中的 response.result 不包含您认为包含的任何数据。因此,您对 collection.set(...) 的调用实际上是从集合中删除所有项目。

尝试删除那个 success 回调并看看还会发生什么。


有点不相关但仍然很重要:

  • 同步使用 Collection.fetch(...) 被认为是不好的做法;如果您的服务器 return 数据花费的时间超过几百毫秒,浏览器可能会锁定。
  • url 指定为 Collection.fetch(...) 的参数并不是一个糟糕的主意,但请考虑扩展 Backbone.Model 并改为指定 urlRoot 参数。如果您的服务器遵循 REST-ful 约定,那么以这种方式 create/update/delete 数据会变得非常容易。

sync/async 请求有误。我的提取是异步的:false,所以我只是将其更改为异步:true 并为该 collectionView 设置重置集合事件。