Ember.js Как получить контроллер в потребностях, который является вложенным controllerName

Я хочу использовать this.get('controllers.pack.query');, чтобы получить App.PackQueryController в App.PackController, но не удалось.

Я думаю, проблема в том, что Ember использует pack, а не 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
    }
});

person Isaddo    schedule 21.06.2013    source источник


Ответы (3)


Вы должны использовать верблюжий регистр, а не точечную запись для этого.

Ваш контроллер пакета должен быть

 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
   }
});
person WallMobile    schedule 21.06.2013
comment
Это не работает после ember-cli 0.2.3. Смотрите ответ @rog для рабочего решения. - person Nathan Cox; 12.06.2015

Для доступа к контроллеру следует использовать 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.


[УСТАРЕЛО] Доступ к вложенным контроллерам из других контроллеров с помощью needs:

Установите needs на контроллере:

...
needs: ['pack/query'],
...

Затем получите к нему доступ, используя:

this.get('controllers.pack/query');

[УСТАРЕЛО] Доступ к вложенным контроллерам из маршрутов:

В идеале actions нужно поставить на рут. Если вы используете описанный выше шаблон needs в своем actions на контроллере, подумайте о рефакторинге.

Вы можете получить доступ к вложенным контроллерам из маршрута, используя controllerFor следующим образом:

this.controllerFor('pack/query')
person rog    schedule 07.08.2014
comment
Снова обновлено, чтобы отразить новые версии (Ember 1.11.1 и ember-cli 0.2.3) - person rog; 09.04.2015
comment
Спасибо за это, на удивление мало информации по этому вопросу, и добраться до нее, кажется, можно вслепую, спотыкаясь в темноте. - person Nathan Cox; 12.06.2015
comment
Обновлено снова, чтобы отразить более новую версию (Ember 1.13.5), которая ввела устаревание исходного ответа. - person rog; 31.07.2015

Есть более новый, инъекционный синтаксис для того же варианта использования.

accountQueueController: Ember.inject.controller('account/queue'),
...
this.get('accountQueueController.model.myProperty')

источник: http://discuss.emberjs.com/t/needs-with-nested-controller/8083/6

person goutham    schedule 24.07.2015