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