0

我有一个 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}}在将自定义控制器分配给每个项目时知道如何制作循环会很好。

4

1 回答 1

2

ember 源中的默认值lookupItemController如下:

lookupItemController: function(object) {
  return get(this, 'itemController');
}

因此,您可以使用任何有效的格式,就像在控制器中硬编码 itemController 属性时一样,例如:

App.MyArrayController = Ember.ArrayController.extend({
  itemController: 'myFoo'
});

这记录在这里

最后 itemController 属性将在容器中使用,以检索项目控制器实例,以这种方式:

container.lookup('controller:' + itemController);

给定aApp.MyFooController您可以使用my.foo,myFoo和.MyFoomy_foo

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

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

我希望它有帮助

于 2013-09-27T19:15:16.363 回答