按照Ember上的示例在我的ArrayController定义中设置itemController会导致阻塞错误消息:

TypeError: Cannot call method 'lookup' of null
JSFiddle:http://jsfiddle.net/jgillick/M4BVV/
// Addresses array controller
App.AddressesController = Ember.ArrayController.extend({
    itemController: 'address'
});

// Address object controller
App.AddressController = Ember.ObjectController.extend({
    city: function(){
        return "San Francisco";
    }.property()
});
我发现解决此问题的唯一方法是...
1)在#each处理程序(jsfiddle)中传递itemController:
{{#each addresses itemController="address"}}
    <li>{{line1}}, {{city}}</li>
{{/each}}
...要么...
2)将容器属性添加到ArrayController(jsfiddle):
var addresses = App.AddressesController.create({
    container: indexController.get('container'),
    content: [
        App.Address.create({'line1': '700 Hansen Wy'}),
        App.Address.create({'line1': '900 Hansen Wy'})
    ]
});
这两种解决方案都让人觉得很棘手,而且非常错误。在ArrayController本身中设置itemController怎么办?

最佳答案

Controller 和每个 View 中的itemController没有关系。
尽管这样做是一样的:将对象包装在指定的 Controller 中。

您的第一个实现会抛出Cannot call method 'lookup' of null,因为containerAddressesController实例为null。当您通过其他容器创建 Controller 时,将设置该容器。如果您使用以下代码,则为您抽象:

this.controllerFor('addresses')

代替
 App.AddressesController.create ...

所以这项工作http://jsfiddle.net/marciojunior/GRaa5/



就像我之前说过的那样, Controller 的itemController和每个帮助程序都没有关系。所以你可以混合他。
{{#each addresses itemController="address"}}
    <li>{{line1}}, {{city}}</li>
{{/each}}

观看此动作http://jsfiddle.net/marciojunior/spA9Q/



这项工作是由于我之前的解释,



完成@colymba示例的工作正常,因为在setupController之前:
setupController: function(controller, model){
    controller.set('content', model);
}

ember使用controllerFor在该钩子(Hook)中提供一个 Controller ,然后在生成的 Controller 中也存在该容器。

09-18 04:15