Как запустить событие в Ember из другой структуры

Мы используем версию pre4 ember.

У нас есть структура (SignalR), работающая параллельно с ember, которая обрабатывает уведомления в реальном времени для нашего приложения. В старых версиях ember мы смогли получить доступ к глобальной ссылке маршрутизатора/контроллера. Но с новой версией Ember это уже невозможно. (Это отлично) Мы пробовали разные подходы, такие как настройка глобального контроллера на верхнем маршруте:

setupController: function(){
 app.appController = this.controllerFor('app');
}

и отправки события этому контроллеру, который пузырится до маршрута следующим образом:

notificator.update = function (context) { 
 app.appController.send('notificationOccured', context);
});

Но это похоже на работу против команды Ember, которая просто удалила глобальные ссылки.

Итак, теперь к большому вопросу: есть ли лучший способ доступа к маршрутизатору или контроллеру со стороны Ember? Предпочтительно отправлять событие либо с контекстом.

Вся помощь приветствуется!

2 ответа

Итак, теперь к большому вопросу: есть ли лучший способ доступа к маршрутизатору или контроллеру со стороны Ember? Предпочтительно отправлять событие либо с контекстом.

Да. Это звучит как хорошая подгонка для электронного инструментального модуля. Попросите соответствующего контроллера подписаться на события SignalR, а затем запускайте их, когда ваше приложение обрабатывает уведомление в реальном времени.

Сначала добавьте метод ApplicationController для обработки обновлений. Если здесь не определено, событие будет пузыриться на маршрутизаторе.

App.ApplicationController = Ember.Controller.extend({
 count: 0,
 name: 'default',
 signalrNotificationOccured: function(context) {
 this.incrementProperty('count');
 this.set('name', context.name);
 }
});

Затем настройте свой ApplicationController, подписавшись на событие signalr.notificationOccured. Используйте перед обратным вызовом для регистрации события и отправки его полезной нагрузки в контроллер.

App.ApplicationRoute = Ember.Route.extend({
 setupController: function (controller, model) {
 Ember.Instrumentation.subscribe("signalr.notificationOccured", {
 before: function(name, timestamp, payload) {
 console.log('Recieved ', name, ' at ' + timestamp + ' with payload: ', payload);
 controller.send('signalrNotificationOccured', payload);
 },
 after: function() {}
 });
 }
});

Затем из приложения SignalR используйте Ember.Instrumentation.instrument для отправки полезной нагрузки в ApplicationController следующим образом:

notificator.update = function (context) { 
 Ember.Instrumentation.instrument("signalr.notificationOccured", context);
});

Я разместил рабочую копию с симулированными уведомлениями SignalR здесь: http://jsbin.com/iyexuf/1/edit

Документы на инструментальном модуле можно найти здесь а также проверить спецификации для получения дополнительных примеров.


Вероятно, вы не должны этого делать, а вот способ получить доступ к контроллерам приложений, представлениям, моделям и экземплярам маршрутизатора. Когда ваше приложение инициализировано, контроллеры, представления, модели и маршрутизатор зарегистрированы в контейнере приложения __container__

APP.__container__.lookup('controller:foo').get('content');
APP.__container__.lookup('view:foo').get('templateName');
APP.__container__.lookup('router:main');

Я думаю, что вам следует сделать инкапсуляцию вызовов в стороннюю библиотеку внутри Ember и позволить Ember управлять всем приложением. См. эту попытку, чтобы сделать JQuery UI ember-aware

licensed under cc by-sa 3.0 with attribution.