BackboneJS:迭代模型属性并更改值

时间:2013-09-27 03:36:22

标签: javascript backbone.js underscore.js backbone-model

我想创建一个功能,如toJSON()的功能,返回和编辑模型。

我的问题是如何迭代模型的属性并编辑所选属性的特定值。

如果有型号,例如:

Item = Backbone.Model.extend({
    defaults: {
        name: '',
        amount: 0.00
    },
    toHTML: function(){
        // i think this is the place where
        // where i can do that function?

        //
        console.log(this.attribute)
    }
});
var item = new Item;

item.set({name: 'Pencil', amount: 5}): 

item.toJSON();
-> {name: 'Pencil', amount: 5}

// this is the function
item.toHTML();
-> {name: 'Pencil', amount: 5.00}

3 个答案:

答案 0 :(得分:5)

您可以使用for ... in loop迭代对象,然后使用toFixed格式化数字:

toHTML: function() {
    var attrs = { }, k;
    for(k in this.attributes) {
        attrs[k] = this.attributes[k];
        if(k === 'amount')
           attrs[k] = attrs[k].toFixed(2);
    }
    return attrs;
}

请注意,amount将以字符串形式显示,但这是获得5.00而不是5的唯一途径。我可能会将格式保留到模板中,而不用担心这个toHTML实现。

演示:http://jsfiddle.net/ambiguous/ELTe5/

答案 1 :(得分:4)

如果要迭代模型的属性,请使用attributes哈希:

// Inside your model's method
for(attr in this.attributes){
    console.log(attr, this.attributes[attr]);
}

Here's a jsFiddle使用您的示例代码。

答案 2 :(得分:4)

虽然这里提供的答案是正确的,但会做你想要的。但我认为更好的方法是使用下划线功能来实现此目的。 对于简单循环,您可以使用

_.each(list, iteratee, [context])

_.each(model.attributes, function(item, index, items){
  console.log(item);
  console.log(index);
})

您还可以根据自己的特定需要使用专门的功能。就像你想要在列表的每个元素上应用一些函数而想要一个新的结果数组一样,map可能是你的最佳选择。

_.map(list, iteratee, [context])

var newList = _.map(model.attributes, function(item, index, list){
  return item * 5;
})

我建议您阅读下划线和骨干文档,以获得最符合您需求的功能。