loadMore: function(){
var $this = this;
console.log(this.Messages); //SAME AS AFTER
this.Messages.url = '/js/messages/?start=' + this.Messages.length
this.Messages.fetch({'add':true,
success:function(){
console.log($this.Messages); //SAME AS BEFORE??
},
error:function(){
}
});
},
集合未更新。在此功能之后,将触发事件,并在屏幕上绘制新项目。问题是该集合没有添加新模型。
答案 0 :(得分:21)
正如之前的回答中提到的,{1.0}中删除了add
选项。您可以通过传递remove: false
来完成同样的事情。来自docs:
可以使用可用的集来自定义提取的行为 选项。例如,要获取集合,请获取“添加”事件 对于每个新模型,以及每个已更改现有的“更改”事件 模型,不删除任何内容:
collection.fetch({remove: false})
答案 1 :(得分:0)
Backbone.Collection.fetch():
fetch: function(options) {
options = options ? _.clone(options) : {};
if (options.parse === void 0) options.parse = true;
var success = options.success;
options.success = function(collection, resp, options) {
var method = options.update ? 'update' : 'reset';
collection[method](resp, options);
if (success) success(collection, resp, options);
};
return this.sync('read', this, options);
},
那么这里是什么,你的传入函数被分配给var succees
collection[method](resp, options);
被调用,在您的情况下,方法是'reset'
collection.reset
必须通过并添加所有模型,在途中触发所有事件。我不确切知道发生了什么,但它经历了collection.reset
,collection.add
,model.add
等......我没有完全遵循这一切。
我不确定问题到底是什么,对不起。我希望我至少可以帮你尝试一些事情,所以也许我们可以搞清楚。第if (success) success(collection, resp, options)
行是对您的succes函数的调用。您可能尝试做的是让您的成功回调接受传回的参数并对其进行一些安慰:
success: function(collection, resp, options) {
console.log(collection); // this might do the trick.
// if not, you could try the following
collection.on("reset", function(c, options) {
console.log(c); // see what that gives ya.
});
}
另一件事是,我找不到源文件或文档中的任何地方,其中collection.fetch采用了添加选项。如果我错过了,请告诉我,我想看看它。
祝你好运,让我知道你发现了什么。通过调试器的步骤也可能值得追踪。哎呀,这也让我觉得控制台经常向我展示最新版本的集合对象,不应该有它。
尝试安慰收藏品的长度或其他东西:
var len = $this.Messages.length;
console.log(len);
//...
// or in the success callback
var len = collection.length;
console.log(len);
答案 2 :(得分:0)
Backbone 1.0删除了此功能,打破了依赖于此的代码:
http://backbonejs.org/#Collection-fetch
与:比较:
“如果您想将传入模型添加到当前集合中,而不是替换集合的内容,请将{add:true}作为获取选项传递。”
我建议在修复此问题之前恢复旧版Backbone。
答案 3 :(得分:0)
在主干1.0中,你必须手动触发重置:
youColloection.fetch({reset: true});