6

我有这个模型默认值:

test.Models.ItemModel = Backbone.Model.extend({

defaults: {
    name: 'an item',
    units: []
},

然后我使用以下代码设置模型:

 addUnit: function(e){
    if(e.keyCode == 13){
      this.model.set({ 'units' : this.model.get('units').push($('#addUnit').val()) }, 
        {success: function(){
          this.render();
        }}
      );
    }
  },

但是,它似乎永远不会被添加到模型数组中,我在这里做事吗?

4

1 回答 1

8

问题是您假设该push方法返回整个数组;相反,如此处所述,该push方法

length返回调用方法的对象 的新属性。

因此,您需要先将元素推送到数组中,然后再将其设置为模型:

var _units = this.model.get('units');
_units.push($('#addUnit').val());
this.model.set({ 'units' : _units });  

不过要小心,这将修改指向该数组的任何其他内容,因此如果您这样做,例如:

var myArray = [1,2,3]
this.model.set({units: myArray})
var _units = this.model.get('units')
_units.push(4)
this.model.set({ 'units' : _units })
myArray == this.model.get('units') // holy moly, they're the same :(

如果你想避免这种情况,或者仍然想为此使用一行代码,你可以使用数组的concat方法

this.model.set({ 
    'units' : this.model.get('units').concat($('#addUnit').val())
});
于 2012-11-30T11:21:02.047 回答