使用绑定到具有itemController的ArrayController的Ember.Select

时间:2013-02-24 08:16:05

标签: ember.js

我有一个 Ember.Select 视图,它有一个到ArrayController的contentBinding。当我在ArrayController上设置itemController时,它突然抛出此错误: 未捕获的TypeError:无法调用null的方法'child'

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

<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/

有没有人知道这里发生了什么,或者我如何解决它?

1 个答案:

答案 0 :(得分: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 函数中初始化控制器,它们似乎表现得更好。