ember.js - computed - ember data
¿Cómo puedo observar*todos*los cambios de propiedad en un objeto modelo? (4)
Del 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(),
Tengo un modelo construido a partir de un objeto JSON.
// extend the json model to get all props
App.Model = Ember.Object.extend(window.jsonModel);
Quiero guardar automáticamente el modelo cuando algo se actualiza. ¿Hay alguna manera de que pueda agregar un observador a todo el modelo?
EDITAR: // añadiendo la solución que actualmente voy
Por ahora hago:
// XXX Can''t be right
for (var prop in window.jsonModel) {
if (window.jsonModel.hasOwnProperty(prop)) {
App.model.addObserver(prop, scheduleSave);
}
}
Esta es una forma grande, lo que significa que estoy agregando toneladas de observadores; parece tan ineficiente.
Un punto de interrupción de Ember.sendEvent()
en Ember.sendEvent()
revela que hay eventos llamados App.model.lastName:change
se envía. Podía piratear en una intersección allí, pero esperaba una forma oficial.
Puede enlazar a la propiedad isDirty
de la subclase de DS.Model
. isDirty
cambia de falso a verdadero cuando cambia una de las propiedades del modelo. No servirá bien para todos los casos porque cambia solo una vez hasta que se restablece o se confirma, pero para su caso:
Quiero guardar automáticamente el modelo cuando algo se actualiza. ¿Hay alguna manera de que pueda agregar un observador a todo el modelo?
puede funcionar bien
Tenía el mismo requisito, y al no encontrar una respuesta adecuada, implementé una.
Prueba esto: https://gist.github.com/4279559
Esencialmente, el objeto que desea observar todas las propiedades DEBE ser una mezcla 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 únicas para una instancia y no están definidas en ningún prototipo), (propiedades que se definen como parte de la invocación de create ()), y (propiedades que se definen como parte de la definición de clase).
En sus observadores, si desea saber qué propiedades modificaron e invocaron al manejador, la propiedad "modifiedProperties", una matriz, estará disponible con los nombres de las propiedades modificadas.
_anyProperty
una propiedad virtual _anyProperty
propiedad que se puede usar como 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);
}
});