Ember.JS — отправка сообщения от внутреннего контроллера к внешнему контроллеру

#ember.js

#ember.js

Вопрос:

В Ember у меня есть приложение, в котором у меня есть внешний контроллер, шаблон которого отображается в стандартном {{outlet}} .

Однако шаблон содержит именованную розетку {{сведения о розетке}}, и одно из действий этого контроллера выполняет transitionToRoute(), который отображает внутри этой розетки «details», и есть внутренний контроллер, который обрабатывает этот вложенный шаблон.

Что мне нужно сделать, так это выполнить действие над внутренним шаблоном / контроллером, вызывающее действие на внешнем контроллере. Кажется, что Ember не может преодолеть барьер «выхода». События всплывают только внутри розетки, а не в родительские розетки.

Вещи, которые я пробовал:

  1. Пробовал this.send() и this.sendAction() .
  2. Попытался внедрить внешний контроллер во внутренний контроллер (требуется: «main», main: Ember.вычисляется.псевдоним («controllers.main»)) — приводит к ошибке «undefined не является функцией».
  3. Использование тега {{action}} во вложенном шаблоне и отправка действия, существующего на родительском контроллере, приводит к тому, что «Ничто не обработало действие ‘selectTab’. Если вы действительно обработали действие, эта ошибка может быть вызвана возвратом true из обработчика действия в контроллере, что приводит к ошибке «всплывающее действие».

Возможно ли то, что я пытаюсь сделать? Я знаю, что мог бы имитировать это с помощью jQuery, но я бы предпочел не делать этого, я предпочитаю делать это «ember way» (если он есть).

Ответ №1:

Номер 2 работает

 App.IndexRoute = Ember.Route.extend({
  model: function() {
    return ['red', 'yellow', 'blue'];
  },
  renderTemplate: function(){
    this.render();
    var fooCont = this.controllerFor('foo');
    this.render('foo',{
      into:'application',
      outlet:'foo',
      controller:fooCont
    });
  }
});

App.ApplicationController = Em.Controller.extend({
  actions:{
    hello: function(val){
      alert(val);
    }
  }
});

App.FooController = Em.Controller.extend({
  needs:'application',
  application: Em.computed.alias('controllers.application'),
  actions:{
    sendToApp: function(){
      this.get('application').send('hello', 'world');
    }
  }
});
  

http://emberjs.jsbin.com/qatepibu/1/edit

Комментарии:

1. Kingpin2k… Вы невероятно эпичны! 🙂 <3