2012-03-19 5 views
1

Github의 특정 repo 문제 목록을 표시하는 간단한 응용 프로그램을 만들고 있습니다. 다음은 DOMEmber JS : 파괴 된 객체의 속성보기

App.IssueView = Ember.View.extend({ 
    tagName: "li", 
    classNames: ["sugar", "issue_wrapper"], 
    templateName: "app/templates/issue", 
    init: function() { 
    App.LabelsController.addObserver("label", this, this.labelUpdated); 
    this._super(); 
    }, 
    click: function(event) { 
    var target = event.target; 

    if (target.className == "title") { 
     // Using bindingContext is a temporary solution to access data of this issue 
     App.IssuesController.set("issue", this.bindingContext); 
     App.IssuesController.set("state", "viewIssueDetails").notifyPropertyChange("state"); 
    } 
    }, 
    labelUpdated: function() { 
    this.labels = this.labels || this._collectLabels(), 
    label = App.LabelsController.get("label").name; 

    this.set("isVisible", this.labels.indexOf(label) != -1); 
    }, 
    _collectLabels: function() { 
    var labels = []; 

    this.bindingContext.labels.forEach(function(label) { labels.push(label.name) }); 

    return labels; 
    } 
}) 

나는 그것이 내가 가진 문제는이 라인이다

<script type="text/x-handlebars"> 
    {{#view App.IssuesListView}} 
    {{#each App.IssuesController}} 
     {{view App.IssueView contentBinding="this"}} 
    {{/each}} 
    {{/view}} 
</script> 

입니다 생성 방법에 삽입 문제의 HTML을 생성하고 IssueView의 코드는

App.LabelsController.addObserver("label", this, this.labelUpdated); 

새 IssueView가 생성되어 DOM에 삽입 될 때마다 LabelsController의 'label'속성이 업데이트 될 때 "파괴 된 객체에 대해 관찰 된 속성을 설정할 수 없습니다"라는 오류가 발생합니다. Firebug를 살펴보면 이슈뷰의 상태가 inDOM 대신 "파괴"되는 것을 보았습니다. 왜 그런 일이 있었는지 궁금해하고 그걸 해결하기 위해 무엇을 할 수 있습니까?

답변

2

템플릿에있는 #each 도우미는 문제 컬렉션이 변경 될 때 IssueViews가 만들어지고 파괴되도록합니다. 관찰자를 수동으로 추가하고 있습니다. 즉, 관찰자를 제거해야합니다. 나는 observes(...) 함수 프로토 타입 확장을 사용하면 그것을 처리 할 것이라고 생각합니다. 자세한 내용은 "속성 변경 관찰"에서 http://ember-docs.herokuapp.com/symbols/Ember.Observable.html을 참조하십시오.

수동 경로를 찾으려면 addObserver를 didInsertElement으로 이동하고 willDestroyElement에 해당 removeObserver를 추가하십시오.

이 코드로 무엇을하려하는지 이해하고 있다면, 접근 방식 대신 선택된 라벨을 기반으로 올바른 이슈 세트를 제시하는 ArrayController에 바인딩하는 것을 고려할 것입니다. 하고있다.

+0

좋습니다. 저는 수동 접근법을 사용하고 'willDestroyElement'에서 'removeObserver'라고 불렀습니다. 이제는 작동하는 것 같습니다. –

+0

그리고 여러분의 쪽지에 관해서는, 제가 여기서하고있는 것입니다. 기본적으로 'labelUpdated'가 호출되면 각각의 'issueView'는 스스로에게 묻습니다 : '이봐, 내 레이블 중 하나를 선택하는 레이블인가?', 그렇지 않으면보기가 숨겨지고 반대의 경우도 마찬가지입니다. –

+2

기쁘다. 부가 메모에서 제안하는 대체 설계는 라벨이 업데이트되고 배열 컨트롤러 (예 :'App.FilteredIssuesController')가 콘텐츠 배열을 업데이트하여 적절한 문제를 추가/제거하는 것입니다. '# each' 템플릿은'FilteredIssuesController'에 묶여 져서 컨트롤러의 콘텐트 배열이 바뀌면 자동으로 업데이트됩니다. 더 적은 코드와 모델 및 뷰 관심사의 분리를 의미합니다. 그냥 내 .02 달러. :) –

관련 문제