我有一个 ArrayController 管理一组不同风格的项目。为了处理它们,我有几个项目控制器,它们都是通用项目控制器的子类:
App.ItemsController = Ember.ArrayController.extend({
lookupItemController: function (object) {
switch (object.get('type')) {
case 'type1': return 'ItemType1';
case 'type2': return 'ItemType2';
}
}
});
//superclass for item controller
App.ItemController = Ember.ObjectController.extend({
...common logic to all item controllers
});
App.ItemType1Controller = App.ItemController.extend({
msg: 'I am of type1',
init: function() {console.log('in App.ItemType1Controller');}
});
App.ItemType2Controller = App.ItemController.extend({
msg: 'I am of type2'
});
我的第一个问题是返回值的正确语法/格式lookupItemController
。我试过'App.ItemType1Controller'
了,但是没有找到控制器。文档中的示例显示返回'field'
意味着App.FieldController
,但在我的情况下应该是什么?
返回'ItemType1'
可以避免任何错误,但init
永远不会调用钩子,并且msg
在模板中使用时属性未定义,例如
{{#each controller}}
{{msg}}
{{/each}}
我尝试单步执行 ember 代码,但迷失在容器、解析器和工厂的迷宫中。我正在尝试做的事情有什么问题吗,完成它的正确方法是什么?
更新
答案帮助我解决了我的问题,而这实际上存在于其他地方。我一直在对模型进行子集化
filteredContent: Ember.computed.filter('content', ...)
然后在模板中对其进行处理
{{each filteredContent}}
问题是结果lookupItemController
没有与集合中的每条记录相关联(#each controller
工作正常)。我仍然不知道如何解决这个问题,所以我采取了不同的路线,但是{{each}}
在将自定义控制器分配给每个项目时知道如何制作循环会很好。