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