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

时间:2016-03-13 20:08:34

标签: javascript backbone.js requirejs marionette

我认为初始化集合返回了一个Backbone.Collection的现成实例。但是,在获取之后,该集合包含一些模型,但在require中,_this.serviceCollection.toJSON()为我提供了未定义的对象。

My 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);
        });
    }

这段代码出了什么问题?

2 个答案:

答案 0 :(得分:1)

错误是同步/异步请求。我的fetch是async:false,所以我只是将它更改为async:true并在该collectionView的reset collection上设置一个set事件。

答案 1 :(得分:0)

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

  

...如果该集合包含列表中不存在的任何模型,则会将其删除。

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

尝试删除success回调&看看还会发生什么。

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

  • 同步使用Collection.fetch(...)被认为是不好的做法;如果您的服务器需要超过几百毫秒才能返回数据,浏览器可能会锁定。
  • url指定为Collection.fetch(...)的参数并不是一个糟糕的主意,但请考虑扩展Backbone.Model并指定urlRoot参数。如果您的服务器遵循REST-ful约定,那么以这种方式创建/更新/删除数据非常容易。