Backbone collection 0.9.9 - 添加事件不起作用 将主干更新到0.9.9后,我遇到了问题(添加)。
(function () {
var Model = Backbone.Model.extend({
initialize: function () {
console.log('initialize Model');
}
});
var Collection = Backbone.Collection.extend({
model: Model,
url: "/json.json",
initialize: function () {
console.log('initialize Collection');
}
});
var View = Backbone.View.extend({
initialize: function () {
console.log('initialize View');
}
});
var collection = new Collection([
{
"id" : "001",
"name" : "Дарья",
"text" : "1 Вопрос - Ответ 1"
}
]);
collection.on('add', function () {
console.log('edd event', this)
});
collection.fetch({
add: true,
//silent: false,
success: function (model) {
console.log('fetch')
}
});
}());
console.log('edd event',this) - 不行( 在旧版本中它可以工作
答案 0 :(得分:3)
似乎不再支持add
的{{1}}选项。
从0.9.2源码(collection.fetch):
collection.fetch
来自0.9.9 source(collection.fetch):
collection[options.add ? 'add' : 'reset'](collection.parse(resp, xhr), options);
因此默认情况下var method = options.update ? 'update' : 'reset';
collection[method](resp, options);
if (success) success(collection, resp, options);
会导致集合重置,并会触发collection.fetch
事件。如果您传递选项reset
,则会执行update:true
。
根据documentation for the new collection.update method,更新将触发添加模型的update
事件,因此以下内容应该有效:
add
只需测试并注意,如果移除或更改模型,新的更新方法也会触发collection.fetch({
update: true,
success: function (model) {
console.log('fetch')
}
});
和remove
个事件。
答案 1 :(得分:1)
您需要删除注释掉的行,否则它不会传播添加事件(参见backbone.js源代码的第827行)。所以以下内容应该有效
collection.fetch({
add: true,
silent: false,
success: function (model) {
console.log('fetch')
}
});
我不确定这是否与以前的版本有所不同:)
答案 2 :(得分:1)
根据我从Backbone 0.9.9来源收集的内容,add
-option对fetch
不执行任何操作,除非您添加update
- 选项。 source
所以要做一些有用的事情,请执行以下操作:
collection.fetch({
add: true,
update: true, // this is necessary as well
//silent: false,
success: function (model) {
console.log('fetch')
}
});
这也是导致问题的原因。提取时,Collection
会在获取后自动默认为reset
功能。 reset
使add
- 事件沉默,并选择仅触发reset
事件,这可从Backbone.js source
if (models) this.add(models, _.extend({silent: true}, options));
因此,如果您需要update
-events并且在添加新模型之前不想清空集合,请使用add
选项。如果您必须具有重置功能和add
事件,那么您可能必须编写reset
的一些自定义实现。