在ember中使用子类作为项控制器

时间:2013-09-27 17:39:27

标签: ember.js

我有一个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}}循环会很好。

1 个答案:

答案 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.foomyFooMyFoomy_foo

在您的情况下,您可以执行以下操作:

App.ItemsController = Ember.ArrayController.extend({
    lookupItemController: function (object) {
        switch (object.get('type')) {
            case 'type1': return 'itemType1';
            case 'type2': return 'itemType2';
        }
    }
});

我希望它有所帮助