0

バックボーン.jsモデルの初期化関数で配列値を設定しようとしています。'this.set ...'で始まる行で、'予期しない文字列'エラーが発生します。この方法で配列値を設定することはできませんか?

ありがとう!

var bGenericItem = Backbone.Model.extend({

    defaults: {
        attrArray: new Array({'item_id': '', 'type': '', 'name':''})
    },
    initialize: function(){
        // Set the id to cid for now
        this.set({ attrArray["item_id"]: this.cid });
    }
});
4

2 に答える 2

2

あなたがやろうとしていることは意味がありません。あなたdefaultsは単一のオブジェクトを保持する配列です:

defaults: {
    attrArray: [
        { item_id: '', type: '', name: '' }
    ]
},

属性オブジェクトのリストを保持する場合は、配列を使用します。しかし、属性オブジェクトのリストがある場合、どれを参照するitem_idことを期待attrArray['item_id']しますか?これは常にデフォルト値に初期化され、モデルの初期データの一部としてattrArray誰も送信しないと想定していますか?attrArrayもしそうなら、あなたはこのようなものがもっと欲しいでしょう:

// Use a function so that each instance gets its own array,
// otherwise the default array will be attached to the prototype
// and shared by all instances.
defaults: function() {
    return {
        attrArray: [
            { item_id: '', type: '', name: '' }
        ]
    };
},
initialize: function() {
    // get will return a reference to the array (not a copy!) so
    // we can modify it in-place.
    this.get('attrArray')[0]['item_id'] = this.cid;
}

特別な処理を必要とする配列属性でいくつかの問題が発生することに注意してください。

  1. get('attrArray')モデル内にある配列への参照を返すため、その戻り値を変更するとモデルが変更されます。
  2. a = m.get('attrArray'); a.push({ ... }); m.set('attrArray', a)期待どおりに機能しない、配列が変更されたことsetに気付かない(変更されていないため、a == a結局のところtrueである)ため、との間のどこかに"change"クローンを作成しない限り、イベントを取得できません。attrArraygetset
于 2013-01-23T22:21:07.627 に答える
1

コードにいくつかの問題があります

1:defaults設定はオブジェクトリテラルです。つまり、設定した値は、定義されるとすぐに設定されます。リテラル値ではなく、デフォルトを関数に設定する必要があります。これにより、すべてのモデルインスタンス間でコピーを共有するのではなく、各モデルインスタンスがデフォルト値の独自のコピーを取得できるようになります。

2:また、を使用するべきではなくnew Array、配列リテラル構文を使用するだけ[]です。ただし、このコードでは実際には配列を使用していないため、ここでは配列ラッパーを削除しました。

attrArray3:直接アクセスすることはできません。モデルの属性から取得してから更新する必要があります


var bGenericItem = Backbone.Model.extend({

    defaults: function(){
      return {
        attrArray: {'item_id': '', 'type': '', 'name':''}
      };
    },
    initialize: function(){
        // Set the id to cid for now
        var arr = this.get("attrArray");
        arr["item_id"] = this.cid;
    }
});
于 2013-01-23T22:19:45.057 に答える