2013-06-21 5 views
15

Я хочу использовать this.get('controllers.pack.query');, чтобы получить App.PackQueryController в App.PackController, но не удалось.Ember.js Как получить контроллер в потребностях, который является гнездовым контроллеромName

Я думаю, что проблема Ember использовать pack не pack.query, как controllerName , когда он пытается получить контроллер. Хотя я могу получить контроллер, this.controllerFor('pack.query'), но угасающий говорит, что это не рекомендуется, пожалуйста, используйте 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 
    } 
}); 

ответ

16

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

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

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 
    } 
}); 
+1

Это делает не работает post ember-cli 0.2.3. См. Ответ от @rog для рабочего решения. –

35

Ember.inject.controller() следует использовать для доступа к контроллеру. Используйте его так:

Установка

... 
myController: Ember.inject.controller('pack'), 
nestedController: Ember.inject.controller('pack/query') 
... 

Getting

... 
this.get('myController'); 
this.get('nestedController'); 
... 

Ответ на этот вопрос выше был обновлен, чтобы отразить needsdeprecation в Ember 1.13.5 (выпущен 19 июля 2015). Я оставил старые ответы ниже, но не должен использоваться, если вы не используете более старую версию Ember.


[DEPRECATED] Доступ вложенных контроллеров с другими контроллерами с помощью needs:

Набор needs на контроллере:

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

обращаться к нему с помощью:

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

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

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

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

this.controllerFor('pack/query') 
+0

Обновлено, чтобы отразить новые версии (Ember 1.11.1 и ember-cli 0.2.3) – rog

+0

Благодарим вас за это, есть удивительно мало информации по этому вопросу, и добраться до него, похоже, является вопросом слепо темно. –

+0

Обновлено, чтобы отразить более новую версию (Ember 1.13.5), которая ввела унижение оригинального ответа. – rog