Ember.js 如何获取需要嵌套的控制器名称
Posted
技术标签:
【中文标题】Ember.js 如何获取需要嵌套的控制器名称【英文标题】:Ember.js How to get controller in needs which is nested controllerName 【发布时间】:2013-06-18 03:05:24 【问题描述】:我想用this.get('controllers.pack.query');
来获取
App.PackQueryController
在 App.PackController
中,但失败了。
我认为问题在于 Ember 使用 pack
而不是 pack.query
作为 controllerName
当它试图获取控制器时。
虽然我可以通过this.controllerFor('pack.query')
获得控制器,
但 Ember 表示已弃用,请改用 needs
我的路由器地图如下所示,我在App.PackController
中定义了needs: ['pack.query']
App.Router.map(function ()
this.resource('pack', function ()
this.route('index', path: '/:pack_id')
this.route('query');
);
);
App.PackController = Ember.ObjectController.extend(
needs: ['pack.query'],
queryPack: function ()
var packQueryCtrller = this.get('controllers.pack.query');
Ember.debug('packQueryCtrller: ' + packQueryCtrller);
//DEBUG: packQueryCtrller: undefined
packQueryCtrller.queryPack(); //faild packQuery is undefined
);
App.PackQueryController = Ember.ArrayController.extend(
queryPack: function (queryKey)
//...do query pack
);
【问题讨论】:
【参考方案1】:你应该使用驼峰式,而不是点表示法。
你的包控制器应该是
App.PackController = Ember.ObjectController.extend(
needs: ['packQuery'],
queryPack: function ()
var packQueryCtrller = this.get('controllers.packQuery');
Ember.debug('packQueryCtrller: ' + packQueryCtrller);
//DEBUG: packQueryCtrller: undefined
packQueryCtrller.queryPack(); //faild packQuery is undefined
);
【讨论】:
这在 ember-cli 0.2.3 后不起作用。请参阅@rog 的答案以获得有效的解决方案。【参考方案2】:Ember.inject.controller()
应该用于访问控制器。像这样使用它:
设置
...
myController: Ember.inject.controller('pack'),
nestedController: Ember.inject.controller('pack/query')
...
获取
...
this.get('myController');
this.get('nestedController');
...
上面的答案已更新以反映 Ember 1.13.5(2015 年 7 月 19 日发布)中的 needs
deprecation。我在下面留下了旧答案,但除非您使用的是旧版本的 Ember,否则不应使用。
[已弃用] 使用 needs
从其他控制器访问嵌套控制器:
在控制器上设置needs
:
...
needs: ['pack/query'],
...
然后使用:
this.get('controllers.pack/query');
[已弃用] 从路由访问嵌套控制器:
理想情况下,actions
应该放在路由上。如果您在控制器上的actions
中使用上述needs
模式,请考虑重构。
您可以使用controllerFor
从路由访问嵌套控制器,如下所示:
this.controllerFor('pack/query')
【讨论】:
再次更新以反映新版本(Ember 1.11.1 和 ember-cli 0.2.3) 谢谢你,关于这个主题的信息令人惊讶地少,而且似乎只是在黑暗中盲目地跌跌撞撞。 再次更新以反映新版本(Ember 1.13.5)引入了对原始答案的弃用。【参考方案3】:对于相同的用例有一个更新的注入语法
accountQueueController: Ember.inject.controller('account/queue'),
...
this.get('accountQueueController.model.myProperty')
来源:http://discuss.emberjs.com/t/needs-with-nested-controller/8083/6
【讨论】:
以上是关于Ember.js 如何获取需要嵌套的控制器名称的主要内容,如果未能解决你的问题,请参考以下文章
Ember.JS - 如何在同一页面中使用多个模型、控制器和视图?