1

我有一个Ember.Select视图,它有一个到 ArrayController 的 contentBinding。当我在 ArrayController 上设置 itemController 时,它突然抛出这个错误: Uncaught TypeError: Cannot call method 'child' of null

这是一个极简主义的例子:

<script type="text/x-handlebars" data-template-name="application">
    {{view Ember.Select viewName="select"
                    contentBinding="App.monstersController"
                    optionLabelPath="content.name"
                    optionValuePath="content.id"
                    prompt="Pick a monster:"
                    selectionBinding="App.stateController.selectedMonster"}}

</script>

和javascript:

window.App = Em.Application.create();

App.ApplicationController = Em.Controller.extend({});

App.ApplicationView = Em.View.extend({
    templateName: 'application'
});

App.data = [{
    id: 1,
    name: "Grog",
    strength: 10,
    species: "Troll"
}, {
    id: 2,
    name: "Ognog",
    strength: 8,
    species: "Goblin"
}, {
    id: 3,
    name: "Fred",
    strength: 3,
    species: "Human"
}];

App.stateController = Em.Controller.create({
    selectedMonster: null
});

App.MonsterController = Em.ObjectController.extend({
    name: function() {
        return "Controller Modified " + this.get('name');
    }.property('content.name')
});

App.MonstersController = Em.ArrayController.extend({
    content: App.data/*,
    itemController: "monster"*/
});

App.monstersController = App.MonstersController.create({});

这是一个小提琴,演示了问题:http: //jsfiddle.net/Malkyne/AkHhF/

有谁知道这里发生了什么,或者我该如何解决?

4

1 回答 1

1

经过多次摆弄(哈!),我想我有一个可行的解决方案。以下是步骤:

1.) 添加一个ApplicationRoute规范来设置控制器。看起来像这样:

App.ApplicationRoute = Ember.Route.extend({
  setupController: function() {
    this.controllerFor('monsters').set('content', App.data);
  }
});

2.) 从App.MonstersController中删除内容元素,因为该内容现在正在路由器中分配。现在,它看起来像这样:

App.MonstersController = Em.ArrayController.extend({
    itemController: 'monster'
});

3.) 将 Ember.Select 视图完全从模板中拉出,因为即使我称该视图为“怪物”,我似乎也无法找到将其内容绑定到怪物集合的方法。用这个替换它:

<script type="text/x-handlebars" data-template-name="application">    
    {{render monsters}}
</script>

4.) 现在,让我们扩展 Ember.Select 来创建我们的新视图:

App.MonstersView = Ember.Select.extend({
    contentBinding: 'this.controller',
    prompt: "Pick a monster:",
    selectionBinding: 'App.stateController.selectedMonster',
    optionLabelPath: 'content.name',
    optionValuePath: 'content.id'
});

这是一个工作小提琴:http: //jsfiddle.net/Malkyne/KGJXE/

所以,这个故事的寓意是,在最新版本的 Ember 中,App 命名空间中的悬空控制器似乎表现不佳。如果您在 Route setupController函数中初始化控制器,它们的行为似乎要好得多。

于 2013-02-24T10:34:25.920 回答