【问题标题】:How can I update all models in a collection - Backbone.js如何更新集合中的所有模型 - Backbone.js
【发布时间】:2013-05-06 17:41:55
【问题描述】:

我正在设置集合中所有模型的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]

//编辑 这是我希望看到的控制台输出:

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);
  },
});

【问题讨论】:

  • 等等,你是用上面的型号代码和上面的makeStraight方法吗?我问是因为Die.valueDie.attributes.value 不同。后者是您调用 die.set('value',1) 时发生的变化。
  • 是的,我就是这么做的。 @numbers1311407 下面的回复说明了这一点。现在我正在适当地使用模型属性。

标签: javascript backbone.js


【解决方案1】:

只需使用collection.each 方法。

myCollection.each(function(model) {
 // do stuff
});

Checkout Underscore.js 方法由 Backbone.Collection 扩展:http://backbonejs.org/#Collection-Underscore-Methods

【讨论】:

    【解决方案2】:

    您已经更新了集合中的所有模型,但由于在记录时错误地访问了值,您误以为自己没有更新。

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

    此行没有get 模型的值,它在模型实例本身上记录了value 属性,表明您未正确初始化模型。

    pluck 是一种收集方法(each 也是如此,@SimonBoudrias 指出)。处理集合时应尽可能使用指定的方法,而不是自己用下划线包裹它们。

    使用Collection#pluck,您的第一个和最后一个控制台日志将如下所示:

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

    使用它,您会看到更接近预期的结果,但正如所指出的,初始日志仍将是 undefined 的数组,因为 value 似乎是模型实例的属性,而不是适当的模型属性。

    【讨论】:

    • 仅供参考,混入collectionsmodels 的Underscore 方法的完整列表在Backbone 文档中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    相关资源
    最近更新 更多