Javascript 余烬JS:已销毁对象上观察到的属性

Javascript 余烬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

我正在开发一个简单的应用程序,它在Github上显示特定回购协议的问题列表。下面是IssueView的代码,它生成问题的html并插入DOM

 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);