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 :(

これを回避したい場合、またはそのために1行のコードを使用したい場合は、配列のconcatメソッドを使用できます。

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