Ember.js Как получить контроллер в потребностях, который является вложенным контроллеромName
Я хочу использовать this.get('controllers.pack.query');
для получения
App.PackQueryController
в App.PackController
, но не удалось.
Я думаю, что проблема заключается в использовании Ember pack
not pack.query
как controllerName
когда он пытается получить контроллер.
Хотя я могу получить контроллер this.controllerFor('pack.query')
,
но Ember говорит, что он устарел, используйте needs
вместо
Моя карта маршрутизатора понравилась ниже, и я определил needs: ['pack.query']
в 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
Для этого вам следует использовать футляр для верблюда, а не точечную нотацию.
Контроллер пакета должен быть
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()
следует использовать для доступа к контроллеру. Используйте его так:
Настройка
...
myController: Ember.inject.controller('pack'),
nestedController: Ember.inject.controller('pack/query')
...
Получение
...
this.get('myController');
this.get('nestedController');
...
Ответ выше был обновлен с учетом needs
устаревания в Ember 1.13.5 (выпущен 19 июля 2015 г.). Я оставил старые ответы ниже, но не должен использоваться, если вы не используете более старую версию Ember.
[DEPRECATED] Доступ к вложенным контроллерам с других контроллеров с помощью needs
:
Установите needs
на контроллер:
...
needs: ['pack/query'],
...
Затем используйте его:
this.get('controllers.pack/query');
[DEPRECATED] Доступ к вложенным контроллерам из маршрутов:
В идеале, actions
должен быть помещен в Маршрут. Если вы используете шаблон needs
, описанный выше в своем actions
на контроллере, рассмотрите рефакторинг.
Вы можете получить доступ к вложенным контроллерам из маршрута, используя controllerFor
, например:
this.controllerFor('pack/query')
Ответ 3
Там более новый, ввод, синтаксис для одного и того же варианта использования
accountQueueController: Ember.inject.controller('account/queue'),
...
this.get('accountQueueController.model.myProperty')
источник: http://discuss.emberjs.com/t/needs-with-nested-controller/8083/6