2013-05-06 43 views
0

我正在设置集合中所有模型的value属性(在_.each循环中)。循环结束后,每个value属性都保持不变。我相信这是因为_.each循环正在为每个模型创建一个新的实例变量。有没有一种标准的方式来更新我没有遵循的集合的模型?如何更新集合中的所有模型 - Backbone.js

应该强制骰子成直线的代码(1,2,3,4,5,6)。 rollableDice是指具有value属性的骨干模型的骨干集合。这是一个容器模型的方法:

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] 

//编辑 这是控制台输出,我期望看到:

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

等一下,你是否在上面的'makeStraight'方法中使用了上面的模型代码?我问,因为Die.value与Die.attributes.value不一样。后者是你调用'die.set('value',1)'时发生了改变。 – jackwanders 2013-05-06 18:40:27

+0

是的,那正是我正在做的。 @ numbers1311407的回应如下表述清楚。现在我正在使用模型属性。 – Nathan 2013-05-07 14:26:42

回答

3

你已经更新所有的模型集合中,但是可以通过访问值是欺骗,以为你是不是记录时不正确。

console.log(_(this.rollableDice.models).pluck('value')); 

这行做了模型的不get的价值,它的登录模型实例本身value性质,提示您初始化不当的车型。

pluck是一种收集方法(正如each,正如@SimonBoudrias指出的那样)。在可能的情况下处理集合时,应该使用指定的方法,而不是用自己的下划线包装它们。

使用Collection#pluck,你的第一个和最后一个控制台日志是这样的:

console.log(this.rollableDice.pluck("value")); 

利用这一点,你会看到的东西更接近你所期望的,但正如指出的那样,最初的日志仍然会一个undefined的数组,因为value看起来是模型实例的属性,而不是正确的Model属性。

+1

仅供参考,将Underscore方法的完整列表混合到[collections](http://backbonejs.org/#Collection-Underscore-Methods)和[models](http://backbonejs.org/#Model-Underscore-方法)在骨干文档中。 – 2013-05-06 18:28:48

相关问题