我遇到的问题是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
路径
显然只有在嵌套路由的用例中,需求属性才真正起作用?
感谢对此的任何见解..
答案 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'));
}
});