2013-01-23 64 views
0

我想在backbone.js模型初始化函數中設置一個數組值。在以'this.set ...'開頭的行中,我得到一個'意外的字符串'錯誤。以這種方式設置數組值不可能嗎?在backbone.js初始化函數中設置數組值

謝謝!

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 }); 
    } 
}); 

回答

2

你試圖做什麼沒有任何意義。你defaults是保存單個對象的數組:

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

你會使用一個數組,如果你想堅持的屬性對象的列表。但是,如果你有一個屬性對象列表,你期望attrArray['item_id']可以引用哪一個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畢竟是真實的)的方式,所以你不會得到"change"事件,除非你可以在getset之間的某個地方克隆attrArray
1

有幾個問題與您的代碼

1:defaults設置爲對象文本,這意味着分配給它,一旦它被定義設置的值。您需要將您的默認值設置爲一個函數,而不是文字值。這將確保每個模型實例獲取它自己的默認值副本,而不是在每個模型實例之間共享副本。

2:您也不應該使用new Array,只需使用數組字面語法[]即可。但是你並沒有真的在這段代碼中使用數組,所以現在我刪除了數組封裝。你可以直接訪問attrArray。你必須從模型的屬性中得到它,然後更新它


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; 
    } 
}); 
+0

d'oh!我刪除了數組包裝,因爲它對我沒有意義:P –