ember是否仅尊重带有'needs'属性的单个控制器名称

时间:2014-05-19 12:21:17

标签: debugging ember.js

我遇到的问题是Controller没有通过needs属性从另一个继承上下文。当路由/控制器的命名约定由多个单词组成时,问题才出现。

例如,如果我有一个资源:banks和一个控制器:BanksController那么我可以通过controllers.banks.content needs: ['banks']成功将其上下文注入另一个控制器>

然而

如果我有资源:bank-accounts和控制器BankAccountsController;注入控制器的上下文始终为空。因此,例如controllers.bankAccounts.content通过needs: ['bankAccounts'] 工作,到目前为止我的尝试总是空的。

我怀疑这可能是Ember需要功能在内部处理命名约定的错误。

这里有两个jsbin说明了这个问题:

使用单段变量名称 工作示例

http://jsbin.com/qogit/2/edit?html,js,output

使用双段变量名称 非工作示例

http://jsbin.com/liquj/3/edit?html,js,output

附加说明:

我对needs属性的另一个*问题是,即使使用Route和Controller的单变量命名约定,accounts路由最初也会显示 您在所需的Controller banks路径

之前访问该资源

显然只有在嵌套路由的用例中,需求属性才真正起作用?

感谢对此的任何见解..

1 个答案:

答案 0 :(得分:1)

AFAIK路线水平控制器仅在我们访问它们时创建。因此,如果我们需要子控制器中的某些东西,我们可能需要将数据放在父控制器中。在您的情况下,将是应用程序控制器。

您可以将需求用作needs: ['bank-accounts']。这将解决您的第一个问题。 Here is the demo

对于您的第二个问题,我已经让应用程序控制器获取模型数据,因为2个子路由需要相同的数据 - 'accounts','bank-accounts'。现在两个路由控制器都将使用应用程序控制器内容。 Here is the working demo

App.ApplicationRoute = Ember.Route.extend({
  model: function(){
    return App.BankAccounts;
  }
});

App.BankAccountsController = Ember.ArrayController.extend({
  needs: ['application'],
  bankAccounts: Em.computed.alias('controllers.application.content'),
  init: function(){
    console.log(this.get('content'));
  }
});

App.AccountsController = Ember.ArrayController.extend({
  needs: ['application'],

  bankAccounts: Em.computed.alias('controllers.application.content'),
  init: function(){
    console.log(this.get('controllers.application.content'));
  }
});