我有一个 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/
有没有人知道这里发生了什么,或者我如何解决它?
答案 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 函数中初始化控制器,它们似乎表现得更好。