我认为初始化集合返回了一个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);
});
}
这段代码出了什么问题?
答案 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约定,那么以这种方式创建/更新/删除数据非常容易。