2012-03-19 74 views
1

我工作的一个简单的应用程序,它会显示在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。我想知道为什么会发生,我能做些什么来解决它?

回答

2

#each助手在你的模板将确保IssueViews创建和销毁的问题改变集合。您正在手动添加观察者,这意味着您也有责任移除观察者。我相信使用observes(...)函数原型扩展将为您处理。 (请参阅“观察属性更改”下的http://ember-docs.herokuapp.com/symbols/Ember.Observable.html)。

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

一方面说明:如果我正确理解你正在试图用这段代码做什么,我会考虑绑定到一个ArrayController,该ArrayController根据选定的标签处理呈现正确的问题集而不是您的方法正在采取。

+0

这是伟大的。我使用手动方法并在'willDestroyElement'中调用'removeObserver',它现在似乎正在工作。 – 2012-03-20 07:18:39

+0

关于你的侧面说明,这正是我在这里所做的。基本上,当调用'labelUpdated'时,每个'issueView'都会问自己:'嘿,是用户选择我的一个标签吗?',如果不是,视图将被隐藏,反之亦然 – 2012-03-20 07:25:47

+2

很好用。替代设计,我提议在一边注意的是,当标签被更新,阵列控制器(例如'App.FilteredIssuesController')将更新它的内容数组中添加/删除相应的问题。您的模板'#each'将被绑定到'FilteredIssuesController'当控制器的内容数组改变会自动更新。这意味着更少的代码和更多的模型和观点分离。只是我的$ .02。 :) – 2012-03-20 11:37:16