javascript - Ember JS : observed properties on destroyed objects

标签 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.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 的状态是“destroy”而不是 inDOM。我想知道为什么会这样,我可以做些什么来解决这个问题?

最佳答案

模板中的#each 助手将确保在问题集合发生变化时创建和销毁 IssueView。您正在手动添加观察者,这意味着您也有责任删除观察者。我相信使用 observes(...) 函数原型(prototype)扩展可以为您解决这个问题。 (参见“观察属性变化”下的 http://ember-docs.herokuapp.com/symbols/Ember.Observable.html)。

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

附带说明:如果我正确理解您尝试使用此代码执行的操作,我会考虑绑定(bind)到一个 ArrayController,它根据所选标签而不是方法来处理呈现正确的问题集你正在服用。

关于javascript - Ember JS : observed properties on destroyed objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9773810/

相关文章:

javascript - js onchange 提交默认选择选项

ruby-on-rails - 使用Ember Data和Rails后端的示例应用程序

javascript - D3.js 轴刻度条件格式

javascript - 道场 : How to make PUT request on jsonRest store with callback method

javascript - Ember 问题: Uncaught Error: Could not find module handlebars

javascript - 如何在 javascript 中手动切换 Foundation 5 下拉菜单(在 emberjs 应用程序中)?

javascript - 为什么 ember serve 与 index.html 的行为不同?

javascript - Controller 调用失败

Javascript:如何从充满点和星的textaeria获得0-1数组?

javascript - 处理循环数组请求错误的问题