2012-03-16 14 views
10

Recientemente estoy evaluando un marco de JavaScript para usar en nuestro próximo proyecto. Realmente me gusta Ember. Pero en nuestra aplicación, necesitaríamos un mecanismo de evento de la capa de datos para notificar a la capa del controlador que algo ha cambiado. Sé que se podría utilizar en obersevers Ember, por ejemplo ,:¿Admite EmberJs el patrón de evento de publicación/suscriptor?

person.addObserver('fullName', function() { 
    // deal with the change 
}); 

pero me gusta más en Backbone.Events que se puede suscribir o publicar un evento, específicamente:

var object = {}; 

_.extend(object, Backbone.Events); 

object.on("alert", function(msg) { 
    alert("Triggered " + msg); 
}); 

object.trigger("alert", "an event"); 

Alguien tiene una idea si eso es factible en EmberJS?

Para también darle algunos antecedentes sobre mi pregunta, nuestra aplicación es una aplicación en tiempo real. Entonces, de vez en cuando, el servicio RESTful back-end activará un evento en el lado del cliente (lado JavaScript). Me gustaría tener una capa de datos que encapsule el acceso al servicio RESTful back-end, pero también mantenga un caché. Espero que EmberJS.Data pueda ayudarme con eso (esa es una pregunta aparte, quiero encontrar respuestas). Con eso, me gustaría también que la memoria caché se actualice cada vez que ocurra un cambio desde el back-end del servicio RESTful. Una vez que el objeto de caché se haya actualizado, me gustaría que se notifique la capa de Controlador. Esto es básicamente por qué necesito algún mecanismo de evento en el lado de JavaScript.

Tenga en cuenta que la razón por la que no quiero utilizar los observadores es que, a veces, un evento puede significar que debo realizar una acción, es decir, cargar un mensaje o indicar que se está recibiendo una llamada de voz. La forma de la red troncal me parece más natural.

Gracias

Respuesta

11

Desde cometer 2326580 - que está disponible desde v0.9.6 - hay un Ember.EventedMixin, ver http://jsfiddle.net/qJqzm/.

var handler = Ember.Object.create({ 
    otherEvent: function() { 
     console.log(arguments); 
    } 
}); 

var myObject = Ember.Object.create(Ember.Evented, { 
    init: function() { 
     this._super(); 
     this.on('alert', this, 'alert'); 
    }, 
    alert: function() { 
     console.log(arguments); 
    } 
}); 
myObject.on('otherEvent', handler, 'otherEvent'); 

myObject.fire('alert', { 
    eventObject: true 
}); 
myObject.fire('otherEvent', { 
    first: true 
}, { 
    second: true 
});​ 
8

Si quieres un propósito general de publicación/suscripción concentrador, puede aprovechar gatillo/desde evented (como dijo Pangratz) con un poco de azúcar sintáctica. Esto es lo que estoy haciendo:

 
App.Hub = Ember.Object.create({ 
    init: function(){ 
    this.set('HUB', Ember.Object.createWithMixins(Ember.Evented, {})); 
    }, 

    publish: function(){ 
    var hub = this.get('HUB'); 
    return hub.trigger.apply(hub, arguments); 
    }, 

    subscribe: function(){ 
    var hub = this.get('HUB'); 
    return hub.on.apply(hub, arguments); 
    } 
}); 

Luego, para utilizarlo en su aplicación:

 
App.Hub.subscribe('test-started', function(name){ 
    console.log("Test " + name + " started"); 
}); 

... 

App.Hub.publish('test-started', 'Biology I'); 
App.Hub.publish('test-started', 'Calculus'); 
+0

¿cómo iba a darse de baja de un evento mediante su solución? – Parzifal

+0

@Parzifal, agregue un método para "cancelar suscripción" similar a "suscribirse" que llama a http://emberjs.com/api/classes/Ember.Evented.html#method_off en lugar de "on". Puede usarlo como 'App.Hub.unsubscribe ('test-started')'. – digitalbreed

Cuestiones relacionadas