我工作的一個簡單的應用程序,它會顯示在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。我想知道爲什麼會發生,我能做些什麼來解決它?
這是偉大的。我使用手動方法並在'willDestroyElement'中調用'removeObserver',它現在似乎正在工作。 – 2012-03-20 07:18:39
關於你的側面說明,這正是我在這裏所做的。基本上,當調用'labelUpdated'時,每個'issueView'都會問自己:'嘿,是用戶選擇我的一個標籤嗎?',如果不是,視圖將被隱藏,反之亦然 – 2012-03-20 07:25:47
很好用。替代設計,我提議在一邊注意的是,當標籤被更新,陣列控制器(例如'App.FilteredIssuesController')將更新它的內容數組中添加/刪除相應的問題。您的模板'#each'將被綁定到'FilteredIssuesController'當控制器的內容數組改變會自動更新。這意味着更少的代碼和更多的模型和觀點分離。只是我的$ .02。 :) – 2012-03-20 11:37:16