2014-01-17 6 views
2

내 Array를 템플릿과 완전히 동기화 시키는데 문제가 있습니다. ArrayController는 객체를 푸시, 제거 및 업데이트하는 일을 주시하고 있습니다. 그러나 ArrayController는 결과를 필터링하고 객체 중 하나가 변경되면 새로운 속성이 실제로 필터에서 제외되어 결국 제거되지 않습니다. 객체가 변경 될 때 ArrayController가 다시 필터링됩니다.

콘텐츠가 객체의 배열로 설정되어 일을 단순화하기 위해, 아래의 코드를 볼 수 있지만 내 응용 프로그램에서 그것은 객체의와 함께이 항상 변화하고, 기본 배열이 변경 가능한, 그래서 실제로 Ember.A([Ember.Object, Ember.Object])이고 . 이 키를 unique의 값과 일치하지 때문에
App.TabController = Ember.ArrayController.extend({ 
    content: [ 
     {id: 1, key: 'unique'}, 
     {id: 2, key: 'unique'}, 
     {id: 3, key: 'non-unique'}, 
    ], 

    filteredContent: function() { 
     var content = this.get('content'); 

     return this.filter(function(item, idx, en) { 
      return (item.key == 'unique'); 
     }); 
    }.observes('content.length').property('content'), 
}); 

위의 코드

는 템플릿에서 세 번째 개체를 유지하기위한 절대적으로 잘 작동합니다. 그러나 ID가 3 인 객체가 업데이트되면 unique의 주요 변경 사항이 템플릿에 푸시되지 않는다고 말하면서 몇 가지 해결책을 시도했지만 아무 소용이 없습니다.

또한 새 개체에 올바른 키가 있으면 템플릿에 삽입되고 제거되면 제거되며 서식 파일에 표시된 개체의 값은 다음과 같습니다. 개체가 변경되면 업데이트되어 ArrayController이 작업을 수행하고 있다는 것을 알았으므로 결과를 다시 필터링하지 않습니다.

전체 재 렌더링이나 다른 마법을 강요하지 않아도 가능합니까? Ember.arrayComputed를 사용하여 배열의 재 계산을 피하기 위해

App.TabController = Ember.ArrayController.extend({ 
    filteredContent: Ember.computed.filterBy('content', 'key', 'unique') 
}); 

답변

2

나는 종류의이처럼 filterBy 계산 된 속성 매크로를 사용하십시오. 케이스와 함께 사용하는 방법은 다음과 같습니다.

App.TabController = Ember.ArrayController.extend({ 
    filteredContent: Ember.arrayComputed("content.[]", { 
    initialValue: [], 
    addedItem: function(accum, item) { 
     if (item.key == 'unique') { 
     accum.pushObject(item); 
     } 
     return accum; 
    }, 
    removedItem: function(accum, item) { 
     accum.removeObject(item); 
     return accum; 
    } 
    }) 
}); 
+0

내 문제가 해결되어 답변으로 받아 들여집니다. 고맙습니다! – rickibalboa

1

및 성능을 향상 :

+0

배열 요소가 변경되면 배열 요소를 업데이트하고, 화면 변경 내용에 표시되는 속성을 업데이트하겠습니까? 아니면 그냥 추가 및 제거 처리 무엇입니까? – rickibalboa

+1

@rickibalboa 개별 항목에 대한 모든 바인딩이 정상적으로 작동합니다. 이는 콘텐츠 배열에서 항목을 추가/제거 할 때 배열을 다시 평가하지 않도록하는 성능 최적화입니다. –

+0

감사합니다.이 솔루션을 구현 했으므로 답변을 수락하겠습니다. – rickibalboa

관련 문제