2017-01-16 12 views
0

У меня есть контроллер A, который отправил действие с this.send('makeItHappen'), и я хочу обработать его в контроллере B. Как мне это сделать?В Ember, как я могу обработать действие, отправленное с контроллера в другом контроллере

JS:

// controllers/documents/datasets/controller-A 
import Ember from 'ember'; 

export default Ember.Controller.extend({ 
    actions: { 
    sendToDataCenter() { 
     this.send('makeItHappen'); // this throws an error 
    } 
    } 
}); 


// controllers/controller-B 
import Ember from 'ember'; 

export default Ember.Controller.extend({ 
    actions: { 
    makeItHappen() { 
     console.log('It works!!'); 
    } 
    } 
}); 

В контроллер B, он выдает ошибку: Uncaught Error: Nothing handled the action 'makeItHappen'. If you did handle the action, this error can be caused by returning true from an action handler in a controller, causing the action to bubble.

Пожалуйста, может кто-нибудь помочь? Спасибо.

+0

Какая связь между контроллером A и контроллером B ?. Я имею в виду, это родительский маршрут ребенка соответственно?. Если нет соединения, вы можете ввести контроллер и функцию вызова direclty – kumkanillam

+0

Спасибо @kumkanillam, следующие пути: 'контроллеры/документы/наборы данных/контроллер-A' и ' контроллеры/контроллер-B' – Shaoz

+0

Я не нахожу никакого отношения между контроллерами A и B, я имею в виду, когда есть отношения parent-child, тогда 'send' будет пузыриться до родительского контроллера и до маршрута родительского приложения в иерархии. Таким образом, вы можете вводить и напрямую вызывать функцию' makeItHappen' контроллера-B. это возможно – kumkanillam

ответ

2

В общем, каждый маршрут будет иметь один контроллер по умолчанию, если он не определен. В контроллере-A эта строка кода this.send('makeItHappen'); будет искать метод makeItHappen в действии хэш таблиц, документов, контроллера приложения и его соответствующего маршрута, если makeItHappen определен где угодно, и тогда эта ошибка не будет получена.

Чтобы реализовать то, что вам нужно, В настоящее время в вашей иерархии маршрутов/контроллеров между контроллером-A и контроллером-B нет родительско-дочерних отношений. поэтому вы можете просто ввести контроллер-B внутри контроллера-A и сразу вызвать makeItHappen.

// controllers/documents/datasets/controller-A 
import Ember from 'ember'; 

export default Ember.Controller.extend({ 
controllerB:Ember.inject.controller('controller-B');//this should be already instantiated ie,this corresponding route should be visited earlier otherwise you will get `unknown injection: controller:users' Error 
    actions: { 
    sendToDataCenter() { 
     this.get('controllerB').send('makeItHappen'); 
    } 
    } 
}); 
+0

спасибо за ваш ответ. Но я хочу использовать то, что Controller-A отправляет в Controller-B. Является ли тот же метод, который я должен использовать, например, при инъекции контроллера-A в контроллер-B? – Shaoz

+0

Такое требование является нечетным, если вы хотите использовать только одну функцию, тогда вы можете записать ее как файл утилиты и экспортировать и включить ее там, где вам нужно. – kumkanillam

+0

В основном все, что мне нужно, - отправить действие из события onchange в выпадающем меню select с его значением (в Controller-A). Затем поймайте это в другом контроллере (Controller-B), вот и все. Но я не знаю, как это сделать. – Shaoz