2013-07-12 23 views
1

学习的一部分Ember.js我试图根据Adam的示例创建Ember中的表视图。当我们有一个单独的视图控制器时,ItemController不起作用

我面临的问题是,如果我为View创建了一个单独的控制器并为行添加了一个itemController,那么ember会给出以下错误:未捕获的TypeError:无法调用null的空值的方法'lookup'1.0.0- rc.6.js:13933

当我调试这个我发现下面的代码:

controllerAt: function(idx, object, controllerClass) { 
var container = get(this, 'container'), 
    subControllers = get(this, '_subControllers'), 
    subController = subControllers[idx]; 

if (!subController) { 
    subController = container.lookup("controller:" + controllerClass, { singleton: false  }); 

容器作为null检索。

而当它通过ApplicationController运行时,不存在这样的问题。

JS Fiddle使用ApplicationController中的查看和另一个控制器itemController - 适用于这个项目控制器被指定为{{#each controller itemController="tableRow"}}和控制器App.TableRowController

这里是一个非常相似的精细

JS Bin

JS Bin,JS Fiddle使用单独的TableViewController: 物品控制器类似地指定为{{#each controller itemController='tableRow'}
为表视图一个单独的控制器使用绑定:{{view App.TableView controllerBinding="tableViewController"}}这tableViewController被指定为ApplicationController中作为一个属性:

App.ApplicationController = Ember.ArrayController.extend({ 
tableViewController: function() { 
    var tc = Ember.get('App.TableViewController').create(); 
    tc.set('content',Ember.ArrayProxy.create({ 
         content: Ember.A(tableData)}) 
      ); 
    return tc; 
}.property() 
}); 

但由于某些原因,itemController不在这里工作了。

这里是JS Fiddle使用单独的控制器,用于查看,但没有任何itemController - 这工作得很好

有什么我在控制器中缺少什么?

请帮忙。谢谢。

回答

0

随着Ember大部分时间你不直接创建对象,你可以为控制器,模型等等声明类。然后,使用IOC容器创建这些对象。避免像Controller.create这样的事情。同样避免直接controllerBinding而不是使用needs

因此,而不是提供controllerBinding传递由App.TableView呈现的内容。

{{view App.TableView contentBinding=content}} 

tableData的设置也属于model()挂钩。它适用于样本,因为tableData变量在范围内。

这是更新的jsfiddle

+0

我在这里试图完成的是将TableView作为一个独立的组件,它可以在应用程序中的任何位置使用,因此它需要拥有自己的控制器。如果没有任何控制器绑定,控制器将设置为显示视图的任何人,在这种情况下为ApplicationController。所以问题是如果我在[Ember指南 - 查看上下文](http://emberjs.com/api/classes/Ember.View.html)上的示例中有不同的控制器,那么使用itemController会产生问题。我怎样才能有一个单独的视图控制器? –

+0

感谢您指点我正确的方向:使用需求。通过将TableViewContainer放在需要中,然后将其绑定为controllerBinding =“controllers.tableView”来解决它。然后它可以与项目控制器一起工作。这里是工作[小提琴](http://jsfiddle.net/akashb/wEprA/3/)。尽管我仍然认为这可能是一个错误。也许来自Ember团队的人可以看看这个。 –

相关问题