【问题标题】:What is the Backbone way to modify models when added to collection?添加到集合时修改模型的主干方式是什么?
【发布时间】:2014-01-24 10:17:03
【问题描述】:

我的模型有一个index 属性,默认为null,但应该由集合设置,当添加到它时。这是我最初想到的,但没有奏效。

var model = Backbone.Model.extend({
    defaults: {
        index: null,
        // ...
    },
    // ...
});

var collection = Backbone.Collection.extend({
    // ...
    add: function(model) {
        model.set({ index: this.size() });
        return model;
    },
    comparator: function(model) {
        return model.get('index');
    },
    // ...
});

但是,这不起作用。它抛出错误TypeError: model.set is not a function。什么是正确的方法或我有什么选择?

【问题讨论】:

  • 留下评论,因为它没有回答您的问题,但理想情况下,您的模型根本不具有 index 属性。通过添加它,您需要将集合中模型的顺序与模型上的index 属性同步。但是没有必要将这些信息存储在两个地方。为什么不只在需要时查询集合以获取模型的索引?

标签: javascript sorting backbone.js collections


【解决方案1】:

您不应该真的为此重写 add 方法。

The documentation statesadd 事件会在集合中添加模型时触发。您可以收听此事件并做任何您需要做的事情。

event catalog 中,您可以看到add 事件处理程序将接收添加的模型作为第一个参数,因此您可以执行以下操作:

var collection = Backbone.Collection.extend({
    initialize: function() {
        this.on('add', function (model) {
            model.set({ index: this.size() });
        }, this);
    },
    //...
});

如果您还想在传递给构造函数的模型上运行它,请执行以下操作:

var collection = Backbone.Collection.extend({
    initialize: function(models) {
        _(models).each(function (model, i) {
            model.set({ index: i });
        });

        this.on('add', function (model) {
            model.set({ index: this.size() });
        }, this);
    }
});

【讨论】:

  • 我认为这是正确的,但不幸的是,添加模型时回调没有被执行。
  • @danijar 坏消息,我会测试它:)。
  • @danijar 它似乎工作in this fiddle,请看一下,我想我们会找出问题所在。
  • 似乎,当直接通过集合构造函数传递模型时,Backbone 先添加它们,然后调用initialize()。这已经困扰过我一次了。你知道如何使它与构造函数一起工作吗? jsfiddle.net/XkgLu/1
  • 如果您只使用.add(model),这并没有明显错误,但请注意,如果集合有比较器,则使用size() 这样将设置错误的索引,youadd at特定索引,或使用unshift
猜你喜欢
  • 2015-09-05
  • 2012-03-01
  • 2013-10-11
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多