Ember:在ArrayController中使用itemController不起作用(TypeError:无法调用null的方法'lookup')

Jer*_*ick 4 ember.js

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

TypeError: Cannot call method 'lookup' of null
Run Code Online (Sandbox Code Playgroud)

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()
});
Run Code Online (Sandbox Code Playgroud)

我找到解决这个问题的唯一方法是......

1)在#each处理程序(jsfiddle)中传递itemController :

{{#each addresses itemController="address"}}
    <li>{{line1}}, {{city}}</li>
{{/each}}
Run Code Online (Sandbox Code Playgroud)

...要么...

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'})
    ]
});
Run Code Online (Sandbox Code Playgroud)

这两种解决方案都感觉很乱,而且非常错误.在ArrayController本身设置itemController我做错了什么?

Mar*_*ior 6

itemController从控制器和每个视图,没有关系.虽然它做同样的事情:在指定的控制器中包装一个对象.

您的第一个实现抛出Cannot call method 'lookup' of null,因为该container实例AddressesController为null.当您通过其他容器创建控制器时,将设置容器.如果你使用的话,这是抽象的:

this.controllerFor('addresses')
Run Code Online (Sandbox Code Playgroud)

代替

 App.AddressesController.create ...
Run Code Online (Sandbox Code Playgroud)

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

1)在#each处理程序中传递itemController

就像我之前说过的,itemController从控制器和每个助手,没有关系.所以你可以混合他.

{{#each addresses itemController="address"}}
    <li>{{line1}}, {{city}}</li>
{{/each}}
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/marciojunior/spA9Q/中查看此操作

2)向ArrayController添加容器属性

这项工作是因为我之前的解释,

因为该container实例AddressesController为null

完成@colymba示例有效,因为在setupController之前:

setupController: function(controller, model){
    controller.set('content', model);
}
Run Code Online (Sandbox Code Playgroud)

ember使用the在该钩子中提供控制器controllerFor,然后容器也存在于生成的控制器中.