我工作的一个简单的应用程序,它会显示在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