2011-06-02 14 views

Respuesta

7

Bueno, dependiendo del dominio con el que trabaje, puede usar backbone.js - tiene un objeto "modelo" que puede extender y conectarse a devoluciones de llamada que son activadas por eventos automáticamente cuando se cambia el modelo - eso es decir, establece un campo en el modelo y activará automáticamente un evento que puede escuchar. Tienes que definir tus modelos para extender su Modelo, y llamar a una función setter en lugar de establecer propiedades directamente, pero es muy útil, lo recomiendo.

Por razones de claridad, el evento se dispara del modelo en el cambio, por lo que se activa aunque establezca el valor del atributo programáticamente o en la consola.

+0

Gracias Matt, columna vertebral parece una gran opción. – fancy

+0

Una alternativa sería [spine.js] (http://maccman.github.com/spine/) – Raynos

0

Puede usar getters y setters ro reaccionar en el cambio de propiedades. John Resig ha escrito excelentes article sobre ellos.

5

He escrito algo como esto.

https://github.com/jmoyers/mettle

person.on('name.change', function(val){ 
    // 'a new name was committed: Yolanda' 
    console.log('a new name was committed: ', val) 
}); 

person.name = 'Yolanda'; 

https://github.com/jmoyers/mettle/blob/master/src/model.coffee

Podría ser un poco mucho que excavar a través de toda la fuente. Aquí hay una explicación:

La clave para mi proyecto son dos conceptos. Una es mantener la pista un conjunto de atributos y crear getters y settes para cada uno usando defineGetter y defineSetter. El segundo es 'subclasificar' EventEmitter y transmitir eventos basados ​​en estos cambios de propiedad en su setter.

La pista muestra cómo configuro getter/setter para un conjunto de claves.

Model.prototype.track = function(keys) { 
    _.each(keys, __bind(function(key) { 
     this.tracked.push(key); 
     this.__defineGetter__(key, __bind(function() { 
     return this.get(key); 
     }, this)); 
     return this.__defineSetter__(key, __bind(function(val) { 
     return this.set(key, val); 
     }, this)); 
    }, this)); 
    return this; 
    }; 

Aquí hay un ejemplo de cómo las transmisiones basadas en un fijador de 'magia':

Model.prototype.set = function(key, val) { 
    this.attribs[key] = val; 
    this.emit('change', this.attribs); 
    type = key + '.change'; 
    this.emit(type, val); 
    }; 

Este es un ejemplo simplificado, ya que introduje 'middleware atributo' en la mezcla, pero esto muestra cómo podría emitir un evento de cambio basado en un cambio de propiedad.

Cuestiones relacionadas