ember.js

ember.js - Cómo disparar un evento a Ember desde otro marco



(2)

Estamos usando la versión pre4 de Ember.

Tenemos un marco (SignalR) que funciona en paralelo con Ember que maneja las notificaciones en tiempo real a nuestra aplicación. En las versiones anteriores de Ember pudimos acceder a la referencia global del enrutador / controlador. Pero con la nueva versión de Ember esto ya no es posible. (Esto está bien) Hemos probado diferentes enfoques, como configurar un controlador global en la ruta superior:

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

y enviando un evento a este controlador, que sube hasta la ruta de esta manera:

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

Pero esto parece trabajar en contra del equipo Ember, que acaba de eliminar las referencias globales.

Entonces, ahora a la gran pregunta: ¿hay una mejor manera de acceder al enrutador o un controlador desde fuera de Ember? Preferiblemente envíe un evento a cualquiera con un contexto.

¡Toda ayuda es apreciada!


Entonces, ahora a la gran pregunta: ¿hay una mejor manera de acceder al enrutador o un controlador desde fuera de Ember? Preferiblemente envíe un evento a cualquiera con un contexto.

Sí. Esto suena como un buen ajuste para el módulo de instrumentación de brasas. Haga que un controlador apropiado se suscriba a los eventos SignalR y luego actívelos siempre que su aplicación maneje la notificación en tiempo real.

Primero, agregue un método a ApplicationController para procesar las actualizaciones. Si no se define aquí, el evento burbujeará en el enrutador.

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

A continuación, configure su ApplicationController suscribiéndose al evento signalr.notificationOccured . Use la devolución de llamada anterior para registrar el evento y enviar su carga útil al controlador.

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() {} }); } });

Luego, desde su aplicación SignalR, use Ember.Instrumentation.instrument para enviar la carga útil a su ApplicationController de la siguiente manera:

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

Publiqué una copia de trabajo con notificaciones simuladas de SignalR aquí: http://jsbin.com/iyexuf/1/edit

Los documentos sobre el módulo de instrumentación se pueden encontrar aquí , también consulte las especificaciones para obtener más ejemplos.


Probablemente no deberías estar haciendo esto, pero esta es una forma de obtener acceso a los controladores, vistas, modelos e instancias de enrutadores de la aplicación. Cuando su aplicación se inicializa, los controladores, las vistas, los modelos y el enrutador se registran en el contenedor de la aplicación __container__

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

Lo que creo que debes hacer es encapsular llamadas a la biblioteca de terceros dentro de Ember y dejar que Ember administre toda la aplicación. Vea este intento de hacer que JQuery UI sea consciente de las brasas