0

我在不使用 fectch() 的情况下创建一个集合,但 JSON 数据已经可用。

this.displays = new Displays(jQuery.parseJSON($('#temp_json').html()));

我需要为该集合的每个模型设置一个“位置”值设置,这应该是该模型在此集合中的位置。

我想要做的是捕捉一个事件,在初始加载中,每个模型都是从 JSON 构造并添加到集合中的。

然后我会做类似的事情:

theModel.set('position', this.length);

不幸的是,我找不到应该将我的收藏绑定到的事件。此集合的模型还包含其他集合(...),应该做同样的事情。

这可能看起来很奇怪,但我必须这样做,因为我认为稍后我将执行以下操作:

var prototypeNames = [this.model.get('display').get('position'), this.model.get('position')];

希望这足够清楚。谢谢!

4

3 回答 3

1

-functionCollection.add触发add-event,您可以使用 -function 收听该事件on。该事件将添加的模型和一个选项对象作为参数传递,该对象包含一些有用的属性(例如添加模型的索引)。(这里的文档

所以你会做这样的事情:

collection.on('add', function(model, options) {
  model.set('position', options.index); 
});

如果您想了解有关add-event 传递的参数的更多信息,只需记录它们,因为现有文档充其量是很少的。

collection.on('add', function(model, options) {
  console.log(options); 
});

希望这可以帮助!

于 2012-07-13T14:33:46.007 回答
0

对我有用的解决方案:

我使用了主干关系,这在处理实际模型关系时非常棒。我正在听“relational:add”,它在构建集合时为集合的每个项目触发。

然后我在我的项目上设置一些值并触发一个新事件'postAdd',可以从我的视图中收听。

window.Displays  = Backbone.Collection.extend({
    model: Display,
    initialize: function(data, options){
        this.on("relational:add", function(relModel){
            relModel.set('pos',this.indexOf(relModel));
            this.trigger('postAdd', relModel);
        }, this);
    },

});
于 2012-08-02T11:45:40.460 回答
0

您可以覆盖集合的默认“添加”实现以触发不会被 Backbone 静音的自定义事件。

var MyCollection = Backbone.Collection.extend({

  // Override the default 'add' implementation...
  add: function( models, options ) {

    // Call the default implementation first...
    Backbone.Collection.prototype.add.apply( this, arguments );

    // Fire our custom events on the models...
    while (model = models.shift()) {
      model.trigger('customAdd', model, this, options);
    }

    return this;
  }

});

您现在可以收听模型上触发的“customAdd”事件。当silent = true时,这个事件总是会被触发。

因此,当添加一个带有 {silent: false} 的项目时,将触发两个事件:'add' 和 'customAdd'。

我已经使用这种技术在初始加载新集合并创建所有模型时触发事件。由于将在创建模型之前调用初始化方法,因此我需要覆盖“重置”函数以在创建模型时触发我的代码执行。

于 2013-01-08T14:30:57.797 回答