Javascript 余烬JS:已销毁对象上观察到的属性
我正在开发一个简单的应用程序,它在Github上显示特定回购协议的问题列表。下面是IssueView的代码,它生成问题的html并插入DOMJavascript 余烬JS:已销毁对象上观察到的属性,javascript,ember.js,Javascript,Ember.js,我正在开发一个简单的应用程序,它在Github上显示特定回购协议的问题列表。下面是IssueView的代码,它生成问题的html并插入DOM App.IssueView = Ember.View.extend({ tagName: "li", classNames: ["sugar", "issue_wrapper"], templateName: "app/templates/issue", init: function() { App.LabelsCont
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>
每次生成新的IssueView并将其插入DOM时,当更新LabelController的“label”属性时,我都会收到一个错误“您无法在已销毁的对象上设置观察到的属性”。当我查看Firebug时,我发现我的IssueView的状态是“销毁”,而不是inDOM。我想知道为什么会发生这种情况,我能做些什么来避免这种情况?模板中的每个帮助程序将确保在问题集合发生变化时创建和销毁IssueView。您正在手动添加观察者,这意味着您也要负责删除观察者。我相信使用观察(…)
函数原型扩展将为您解决这个问题。(见“观察财产变化”)
如果您想执行手动路由,请考虑将Adv旁观器移动到<代码> DeDelieltService < /代码>,并在代码> WelDebug元素 >中添加相应的ReaveVistor。
一个注释:如果我正确理解你试图用这个代码做什么,我会考虑绑定到一个数组控制器,它处理基于所选标签而不是所采用的方法来呈现正确的一组问题。我使用手动方法,在“willDestroyElement”中称为“removeObserver”,现在它似乎正在工作。关于你的旁注,这正是我在这里要做的。基本上,当调用“labelUpdated”时,每个“issueView”都会问自己:“嘿,用户选择的标签是我的标签之一吗?”如果不是,视图将被隐藏,反之亦然。我在旁注中建议的替代设计是,当标签更新时,阵列控制器(例如,
App.FilteredIssuesController
)将更新其内容阵列以添加/删除适当的问题。您的模板#每个都将绑定到过滤器DissuesController
,并在控制器的内容数组更改时自动更新。这将意味着更少的代码,更多地分离模型和视图关注点。只有我的$0.02.:)听起来很棒。我要试一试:)
App.LabelsController.addObserver("label", this, this.labelUpdated);