Backbone collection 0.9.9 - 添加事件不起作用

时间:2012-12-14 11:03:12

标签: backbone.js

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) - 不行( 在旧版本中它可以工作

3 个答案:

答案 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的一些自定义实现。