我在不使用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')];
希望这很清楚。 谢谢!
答案 0 :(得分:1)
Collection.add
- 函数会触发add
- 事件,您可以使用on
- 函数进行侦听。该事件传递添加的模型AND选项对象,该对象包含一些有用的属性(如添加模型的索引)作为参数。 (documentation here)
所以你要做这样的事情:
collection.on('add', function(model, options) {
model.set('position', options.index);
});
如果您想了解有关add
- 事件通过的参数的更多信息,请记录它们,因为现有文档充其量只是很少。
collection.on('add', function(model, options) {
console.log(options);
});
希望这有帮助!
答案 1 :(得分:0)
对我有用的解决方案:
我使用 backboneRelational ,这在处理实际模型关系时非常棒。 我正在听“关系:添加”,它是在构建它时为每个项目触发的。
然后我在我的项目上设置了一些值并触发了一个可以从我的视图中收听的新事件'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);
},
});
答案 2 :(得分: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'。
我已经使用此技术在最初加载新集合并创建所有模型时触发事件。由于在创建模型之前将调用initialize方法,因此我需要覆盖'reset'函数以触发我的代码在创建模型时执行。