Ember JS:观察到被破坏对象的属性

Ember JS: observed properties on destroyed objects

本文关键字:对象 属性 JS 观察 Ember      更新时间:2023-09-26

我正在开发一个简单的应用程序,它在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>

我遇到的问题是这条线

App.LabelsController.addObserver("label", this, this.labelUpdated);

每次生成新的IssueView并将其插入DOM时,当LabelsController的"label"属性更新时,我都会收到一个错误"您无法在已销毁对象上设置观察到的属性"。当我查看Firebug时,我发现IssueView的状态是"destroy"而不是inDOM。我想知道为什么会发生这种事,我能做些什么来避免它?

模板中的#each帮助程序将确保IssueViews在问题集合更改时被创建和销毁。您正在手动添加观察者,这意味着您也要负责删除观察者。我相信使用observes(...)函数原型扩展将为您处理此问题。(请参见http://ember-docs.herokuapp.com/symbols/Ember.Observable.html在"观察财产变化"下)。

如果您想采用手动路由,请考虑将addObserver移动到didInsertElement,并在willDestroyElement中添加相应的removeObserver。

还有一点需要注意:如果我能正确理解你试图用这个代码做什么,我会考虑绑定到一个ArrayController,它可以根据所选标签而不是你正在采取的方法来处理正确的问题集