按照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
,因为container
的AddressesController
实例为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 中也存在该容器。