1

我想制作一个功能,如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}
4

3 回答 3

5

for ... in您可以使用循环遍历对象,然后使用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/

于 2013-09-27T03:54:10.687 回答
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;
})

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

于 2015-04-15T03:18:44.263 回答
4

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

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

这是使用您的示例代码的 jsFiddle 。

于 2013-09-27T03:51:46.570 回答