2013-04-18 5 views
3

간단한 작업 만 수행하려고합니다. 모델을 수행하고 있습니다. 개체의 하위 특성에서만 설정하십시오. 내가 myMode.attr_array.state에 손을 잡고 값을 변경할 수 있도록하려면중첩 된 특성을 백본에서 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" 
       } 
      ] 
     } 

:

는 지금, 나는이처럼 보이는 모델이있다. 그러나 .set을 사용하여 attr_array와 같은 첫 번째 수준에서만 속성을 변경할 수있었습니다.

model.set을 사용하여이를 수행 할 수있는 방법이 있습니까?

+0

"attr_array"의 값을'.get()'하고 작업 할 어레이의 내용을 수정하면됩니다. – 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'; 

그리고 집합을 사용할 때 백본은 잃게됩니다.
그럼 어떻게해야합니까? 당신의 객체를 복제하십시오 :

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

관련 문제