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

17

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

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

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

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

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

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

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

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

    
задан TommyKey 22.01.2013 в 13:12
источник

2 ответа

36
  

Итак, теперь к большому вопросу: есть ли лучший способ доступа к маршрутизатору или контроллеру со стороны 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 здесь: Ссылка

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

    
ответ дан Mike Grassotti 24.01.2013 в 19:34
источник
3

Вероятно, вы не должны этого делать, но вот способ получить доступ к контроллерам приложения, представлениям, моделям и экземплярам маршрутизатора. Когда ваше приложение инициализировано, контроллеры, представления, модели и маршрутизатор зарегистрированы в контейнере приложения __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

    
ответ дан ken 23.01.2013 в 21:32
источник