我正在设置集合中所有模型的value
属性(在_.each
循环中)。循环结束后,每个value
属性都保持不变。我相信这是因为_.each
循环正在为每个模型创建一个新的实例变量。有没有标准的方法来更新我没有关注的集合模型?
应该强制骰子成直线的代码(1,2,3,4,5,6)。 rollableDice
指的是具有value
属性的Backbone模型的Backbone集合。这是容器模型上的一种方法:
makeStraight: function() {
console.log('making straight');
console.log(_(this.rollableDice.models).pluck('value'));
var counter = 1;
_(this.rollableDice.models).each(function(die) {
console.log(die.get('value'));
die.set('value', counter);
console.log(die.get('value'));
counter++;
});
console.log(_(this.rollableDice.models).pluck('value'));
},
这是我在控制台上看到的输出:
making straight
[1, 1, 3, 5, 2, 1]
undefined
1
undefined
2
undefined
3
undefined
4
undefined
5
undefined
6
[1, 1, 3, 5, 2, 1]
// EDIT 这是我期望看到的控制台输出:
making straight
[1, 1, 3, 5, 2, 1]
1
1
1
2
3
3
5
4
2
5
1
6
[1, 2, 3, 4, 5, 6]
//编辑我将显示模型代码以响应@ numbers1311407的响应。我不应该使用模型方法来存储和访问属性。相反,即使在模型内部,我也应该使用get / set方法或默认方法(http://backbonejs.org/#Model-defaults)。 这是不该做的事:
var Die = Backbone.Model.extend({
initialize: function() {
_.bindAll(this, 'roll')
},
value: 1,
roll: function() {
this.value = _.random(1,6);
},
});
答案 0 :(得分:5)
只需使用collection.each
方法。
myCollection.each(function(model) {
// do stuff
});
Checkout Underscore.js方法由Backbone.Collection扩展:http://backbonejs.org/#Collection-Underscore-Methods
答案 1 :(得分:3)
您已经在更新集合中的所有模型,但是您在考虑记录时不会错误地访问该值时被欺骗。
console.log(_(this.rollableDice.models).pluck('value'));
此行不get
模型的值,它在模型实例本身上记录value
属性,表明您未正确初始化模型。
pluck
是一种收集方法(就像each
一样,正如@SimonBoudrias指出的那样)。在可能的情况下使用集合时应该使用指定的方法,而不是自己用下划线包装它们。
使用Collection#pluck
,您的第一个和最后一个控制台日志将如下所示:
console.log(this.rollableDice.pluck("value"));
使用它,你会看到更接近你期望的东西,但正如所指出的,初始日志仍然是undefined
的数组,因为value
似乎是模型实例,而不是正确的模型属性。