问题
I want to use this.get('controllers.pack.query');
to get
App.PackQueryController
in App.PackController
, but failed.
I think the problem is Ember use pack
not pack.query
as controllerName
when it tries to get the controller.
Although I can get the controller by this.controllerFor('pack.query')
,
but Ember says it is deprecated, please use needs
instead
My router map likes below and I've defined needs: ['pack.query']
in App.PackController
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:
You should use camel case, not dot notation for this.
Your pack controller should be
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
}
});
回答2:
Ember.inject.controller() should be used to access a controller. Use it like so:
Setting
...
myController: Ember.inject.controller('pack'),
nestedController: Ember.inject.controller('pack/query')
...
Getting
...
this.get('myController');
this.get('nestedController');
...
The answer above was updated to reflect the needs
deprecation in Ember 1.13.5 (released July 19, 2015). I've left the old answers below, but shouldn't be used unless you're using an older version of Ember.
[DEPRECATED] Accessing nested controllers from other controllers using needs:
Set needs
on the controller:
...
needs: ['pack/query'],
...
Then access it using:
this.get('controllers.pack/query');
[DEPRECATED] Accessing nested controllers from routes:
Ideally, actions
should be put on a Route. If you're using the needs
pattern outlined above in your actions
on a controller, consider refactoring.
You can access nested controllers from a Route using controllerFor like so:
this.controllerFor('pack/query')
回答3:
There's a newer, inject, syntax for same use case
accountQueueController: Ember.inject.controller('account/queue'),
...
this.get('accountQueueController.model.myProperty')
source: http://discuss.emberjs.com/t/needs-with-nested-controller/8083/6
来源:https://stackoverflow.com/questions/17227513/ember-js-how-to-get-controller-in-needs-which-is-nested-controllername