2

骨干集合 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) - 无效(在旧版本中有效

4

3 回答 3

3

似乎不再支持该add选项。collection.fetch

从 0.9.2 源(collection.fetch):

collection[options.add ? 'add' : 'reset'](collection.parse(resp, xhr), options);

从 0.9.9 源(collection.fetch):

var method = options.update ? 'update' : 'reset';
collection[method](resp, options);
if (success) success(collection, resp, options);

所以默认情况下collection.fetch会导致集合重置,并且reset事件将被触发。如果你通过 option update:true,并且update将被执行。

根据新 collection.update 方法的文档,更新将触发add添加模型的事件,因此以下应该起作用:

collection.fetch({
    update: true,
    success: function (model) {
        console.log('fetch')
    }
});

只需测试并注意,如果模型被删除或更改,新的更新方法也将触发remove和事件。change

于 2012-12-14T12:36:49.390 回答
1

根据我从查看 Backbone 0.9.9 源代码中收集到的信息,除非您也添加了- 选项,否则 - 选项add不会起作用。资源fetchupdate

因此,要使用它做一些有用的事情,请执行以下操作:

collection.fetch({
    add: true,
    update: true, // this is necessary as well
    //silent: false,
    success: function (model) {
        console.log('fetch')
    }
});

这也是你的问题的原因。获取时,获取后Collection自动默认为reset-function。从 Backbone.js源reset中可以看出,使add-events 静音并选择仅触发reset事件

if (models) this.add(models, _.extend({silent: true}, options));

因此,update如果您想要add-events 并且不想在添加新模型之前清空集合,请使用该选项。如果您必须具有重置功能和add事件,那么您可能需要编写一些自定义实现reset.

于 2012-12-14T12:59:20.547 回答
1

您需要删除注释掉的行,因为否则它不会传播添加事件(请参阅主干.js 源代码的第 827 行)。所以以下应该工作

collection.fetch({
    add: true,
    silent: false,
    success: function (model) {
        console.log('fetch')
    }
});

我不确定这是否与以前的版本有所不同:)

于 2012-12-14T12:27:07.923 回答