2013-02-22 1 views
5

나는 정말 어리석은 뭔가가 빠졌을 것이다. (Ember newbie)하지만 완전히 새로운 배열을 설정하는 것 외에 Ember Controller를 관리하는 배열을 수정하는 방법을 알 수 없다.Ember 컨트롤러가 관리하는 배열의 요소를 어떻게 수정합니까?

예를 들면. 내 컨트롤러에는 다음과 같은 테스트 기능이 있습니다. 사용자가 클릭 할 때 새로운 값을 사용하여 제어 된 배열의 각 요소를 수정 (또는 개별 요소 일 수 있음)하려고합니다.

난 당신이 엠버에게 알려진 변경하려면 "설정"을 가기로되어 있다는 것을 이해하고, 그래서 나는이 일 것이라고 생각 :

clickHandler:function(e){ 
    var temp = this.get("itemList").copy(); // copy it 
    for (var i = 0; i < temp.length; i++) { 
     temp[i].desc = "CANCELLED";  // change it 
    } 
    this.set('itemList', temp); // put it back 
} 

내가 배열의 복사, 수정하기, 다시 설정하십시오. 하지만 여하튼 Ember는 4 행에 대해 불평합니다. 여기서 나는 temp [i] .desc의 내용을 수정하여 Ember.Set을 사용해야한다고 말합니다. 나는 "오프라인"복사본을 수정 한 다음 다시 설정할 수 있다고 가정했으나 중단하고 이유를 파악할 수 없습니다. shift/unshift/pop과 같은 다른 배열 작업이 효과가있는 것 같습니다.

답변

11

당신의 접근 방법은 그리 맘에 들어하지 않습니다. 이 코드는 작동합니다 :

clickHandler:function(e){ 
    var itemList = this.get("itemList"); 
    itemList.forEach(function(item){ // for iterating over an array, always use the forEach function 
     item.set("desc", "CANCELLED"); // you have to call this set()-function to make changes to an Ember Object 
    }); 
} 

왜 세트()를 호출해야합니까 - 방법과 직접 액세스 방법을 사용할 수없는 이유는 무엇입니까?

set() - 메서드를 사용하면 Ember에서 자동 바인딩 마법을 수행 할 수 있습니다. 이 메서드가 호출되면 수정 된 속성에 의존하는 개체에서 수행해야하는 모든 작업을 예약합니다. 가장 쉬운 예는 업데이트가 필요한 주어진 속성을 표시하는 템플릿입니다. 여기

코드에 가능한 개선

위 더 emberish로 만들려면 : 당신은 당신의 itemList에를 관리하는 ArrayController를 사용할 수 있습니다. 이 경우 itemList를 컨트롤러의 컨텐트 속성으로 설정합니다. 어레이를 다루는 경우이 컨트롤러를 활용하는 자습서가 많이 있음을 알 수 있습니다.

App.ItemListController = Ember.ArrayController.extend({ 
    content : null, //set your itemList into this property 
    clickHandler:function(e){ 
     this.get("content").setEach("desc", "CANCELLED"); 
    } 
}); 
+0

감사합니다. 스택 오버플로에 관해 우리에게 교육 할 시간을 갖는 너희들은 대단하다. 불행히도 이러한 솔루션 중 어느 것도 나를 위해 일하지 않습니다. 두 경우 모두 오류가 발생합니다. "Uncaught TypeError : Object # 에는 'set'메서드가 없습니다. 디버거에 따르면 'item'이 작동하는 것처럼 보입니다. item : Object __ember1361578135008_meta : Meta { get 이름 : function() { 집합 내림차순 : function() { 집합 이름 : function() { __proto__ : Object –

+1

제안 사항은 완전히 이해할 수 있습니다. 이유를 알 수 없습니다. 작동하지 않습니다. ArrayController와 행을 사용하는 경우 : this.get ("content"). setEach ('desc', "CANCELLED"); 그렇다면 모든 템플릿 항목이 "CANCELED"로 재설정되는 것을 볼 수 있습니다. 따라서 "forEach"를 사용하면 "set"호출을 허용하지 않는 "item"이 다시 전달됩니다. :^( –

+0

약 3 개월 전 사람들이 저를 시작하도록 도왔을 때 너무 기뻤습니다. 예를 들어 바이올린에 넣을 수 있습니까? 기본 에버 템플릿에 대한 링크를 몇 분 안에 게시 할 것입니다. – mavilein

관련 문제