我有一个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}}
我尝试单步执行余烬代码但迷失在容器,解析器和工厂的迷宫中。我正在尝试做什么有什么问题,以及实现它的正确方法是什么?
更新
答案帮助我解决了我的问题,这个问题实际上存在于其他地方。我在
中对模型进行了子集化filteredContent: Ember.computed.filter('content', ...)
然后在模板中每个人都在上面
{{each filteredContent}}
问题是lookupItemController
的结果没有与集合中的每条记录相关联(#each controller
工作正常)。我仍然不知道如何解决这个问题,所以我选择了不同的路线,但是知道在为每个项目分配自定义控制器时如何进行{{each}}
循环会很好。
答案 0 :(得分:2)
ember源中的默认lookupItemController
如下:
lookupItemController: function(object) {
return get(this, 'itemController');
}
所以你可以使用任何有效的格式,就像在控制器中硬编码itemController属性一样,如:
App.MyArrayController = Ember.ArrayController.extend({
itemController: 'myFoo'
});
记录在案here
最后,itemController属性将在容器中使用,以便以这种方式检索项目控制器实例:
container.lookup('controller:' + itemController);
鉴于App.MyFooController
,您可以使用my.foo
,myFoo
,MyFoo
和my_foo
。
在您的情况下,您可以执行以下操作:
App.ItemsController = Ember.ArrayController.extend({
lookupItemController: function (object) {
switch (object.get('type')) {
case 'type1': return 'itemType1';
case 'type2': return 'itemType2';
}
}
});
我希望它有所帮助