2013-04-18 33 views
3

我試圖做我希望的一件簡單的事情 - 僅在對象的子屬性上執行model.set。在主幹中使用model.set更改嵌套屬性

現在,我有一個模型,看起來像這樣:

{ 
      "attr1" : true, 
      "attr2" : this.model.get("username"), 
      "attr3" : $('#tenant_select').val(), 
      "attr_array": [ 
       { 
        "id": "sub_1", 
        "state": "active" 
       }, 
       { 
        "id": "sub_22", 
        "state": "not_active" 
       } 
      ] 
     } 

我希望能夠抓住伸進myMode.attr_array.state和改變數值。然而,使用.set我只能改變第一級的屬性,即attr_array。

有沒有辦法做到這一點使用model.set?

+0

我敢打賭,如果你只是'獲得()'的「attr_array」和修改數組內容的價值,即會工作。 – Pointy

+0

這是有效的,但問題是我想維護內部的一切順序,現在我的解決方案重新排列順序 – streetlight

回答

18

你可以做到這一點(我想知道爲什麼你沒有設法做到這一點)。但你必須小心:

var array = this.get('attr_array'); 
array[1].state = 'active'; 
this.set('attr_array', array); 

這裏有什麼問題?你的模型擁有對象的引用。因此最後一行是無用的,它根本不會改變任何東西。它簡直相當於:

this.get('attr_array')[1].state = 'active'; 

而且你失去了任何內部東西當你使用set時,骨幹會做什麼。
那該怎麼辦?克隆你的對象:

var array = _.clone(this.get('attr_array')); 
array[1].state = 'active'; 
this.set('attr_array', array); // will trigger 'change' and 'change:attr_array' events 
+0

啊,克隆技巧就是這麼做的。我有一個修復工作像你提到的第一個,但最後一個是完美的!再次感謝! – streetlight