2012-03-19 105 views
1

我工作的一個簡單的應用程序,它會顯示在Github上特定回購的問題列表觀察屬性。下面是IssueView的產生問題的HTML並插入到DOM灰燼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> 

我的問題是這一行的方式代碼

App.LabelsController.addObserver("label", this, this.labelUpdated); 
新IssueView生成並插入到DOM

每次,我得到了一個錯誤:「你不能設置破壞觀察對象屬性」時LabelsController的「標籤」屬性更新。當我看着Firebug時,我發現我的IssueView的狀態是「摧毀」而不是inDOM。我想知道爲什麼會發生,我能做些什麼來解決它?

回答

2

#each助手在你的模板將確保IssueViews創建和銷燬的問題改變集合。您正在手動添加觀察者,這意味着您也有責任移除觀察者。我相信使用observes(...)函數原型擴展將爲您處理。 (請參閱「觀察屬性更改」下的http://ember-docs.herokuapp.com/symbols/Ember.Observable.html)。

如果您想要執行手動路由,請考慮將addObserver移動到didInsertElement並在willDestroyElement中添加相應的removeObserver。

一方面說明:如果我正確理解你正在試圖用這段代碼做什麼,我會考慮綁定到一個ArrayController,該ArrayController根據選定的標籤處理呈現正確的問題集而不是您的方法正在採取。

+0

這是偉大的。我使用手動方法並在'willDestroyElement'中調用'removeObserver',它現在似乎正在工作。 – 2012-03-20 07:18:39

+0

關於你的側面說明,這正是我在這裏所做的。基本上,當調用'labelUpdated'時,每個'issueView'都會問自己:'嘿,是用戶選擇我的一個標籤嗎?',如果不是,視圖將被隱藏,反之亦然 – 2012-03-20 07:25:47

+2

很好用。替代設計,我提議在一邊注意的是,當標籤被更新,陣列控制器(例如'App.FilteredIssuesController')將更新它的內容數組中添加/刪除相應的問題。您的模板'#each'將被綁定到'FilteredIssuesController'當控制器的內容數組改變會自動更新。這意味着更少的代碼和更多的模型和觀點分離。只是我的$ .02。 :) – 2012-03-20 11:37:16