使用 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 设置重置集合事件。
我认为初始化集合会返回 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 设置重置集合事件。