2012-02-08 3 views
16

Tengo un modelo creado a partir de un objeto JSON.¿Cómo observo los cambios de propiedad * todo * en un objeto modelo?

// extend the json model to get all props 
App.Model = Ember.Object.extend(window.jsonModel); 

Quiero guardar automáticamente el modelo cuando se actualice algo. ¿Hay alguna manera de que pueda agregar un observador a todo el modelo?

EDIT: // añadir la solución de momento voy

Por ahora lo hago:

// XXX Can't be right 
for (var prop in window.jsonModel) { 
    if (window.jsonModel.hasOwnProperty(prop)) { 
     App.model.addObserver(prop, scheduleSave); 
    } 
} 

Ésta es una forma grande, lo que significa que estoy añadiendo toneladas de observadores - parece tan ineficiente .

Un punto de interrupción Firebug en Ember.sendEvent() revela que hay eventos llamados App.model.lastName:change que se envían. Podría hackear un intercepto allí, pero esperaba una forma oficial.

Respuesta

2

Desde el artículo:

autosave: function(){ 
    this.save(); 
}.observes('attributes'), 


save: function(){ 
    var self = this, 
    url = this.get('isNew') ? '/todos.json' : '/todos/'+this.get('id')+'.json', 
    method = this.get('isNew') ? 'POST' : 'PUT'; 

    $.ajax(url, { 
    type: 'POST', 
    // _method is used by Rails to spoof HTTP methods not supported by all browsers 
    data: { todo: this.get('attributes'), _method: method }, 
    // Sometimes Rails returns an empty string that blows up as JSON 
    dataType: 'text', 
    success: function(data, response) { 
     data = $.trim(data); 
     if (data) { data = JSON.parse(data); } 
     if (self.get('isNew')) { self.set('id', data['todo']['id']); } 
    } 
    }); 
}, 

isNew: function(){ 
    return !this.get('id'); 
}.property('id').cacheable(), 
+0

El problema está en la propiedad calculada 'attributes' que debe ser obligado explícitamente a todos los * * característica en mi modelo (visto en el artículo original) - esto es lo que no quiero. –

2

que tenían el mismo requisito, y no encontrar una respuesta adecuada, he implementado una.

Prueba esto: https://gist.github.com/4279559

En esencia, el objeto que desea observar todas las propiedades de debe ser un mixto de Ember.Stalkable. Puede observar las propiedades de ese objeto como 'item. @ Properties' (o, si hornea observadores directamente en Stalkable, '@properties' solo funciona. "@ownProperties", "@initProperties" y "@prototypeProperties" también funcionan , y consulte (propiedades que son exclusivas de una instancia y no definidas en ningún prototipo), (propiedades que se definen como parte de la invocación de creación()) y (propiedades que se definen como parte de la definición de clase).

En sus observadores, si desea saber qué propiedades cambiaron y invoca el controlador, la propiedad "modifiedProperties", una matriz, estarán disponibles con los nombres de las propiedades modificadas.

8

usted puede unirse a isDirty propiedad de la subclase de DS.Model. El isDirty cambia de falso a verdadero cuando cambia una de las propiedades del modelo. No servirá bien para todos los casos porque solo cambia una vez hasta que se restablezca o se comprometa, pero para su caso -

Quiero guardar automáticamente el modelo cuando se actualice algo. ¿Hay alguna manera de que pueda agregar un observador a todo el modelo?

puede funcionar bien.

+1

¿Qué sucede si no está utilizando Ember Data? –

0

creé una propiedad virtual _anyProperty que puede ser utilizado como una clave dependiente:

import Ember from 'ember'; 

Ember.Object.reopen({ 

    // Virtual property for dependencies on any property changing 
    _anyPropertyName: '_anyProperty', 
    _anyProperty: null, 

    propertyWillChange(keyName) { 
    if (keyName !== this._anyPropertyName) { 
     this._super(this._anyPropertyName); 
    } 
    return this._super(keyName); 
    }, 

    propertyDidChange(keyName) { 
    if (keyName !== this._anyPropertyName) { 
     this._super(this._anyPropertyName); 
    } 
    return this._super(keyName); 
    } 

}); 
Cuestiones relacionadas