property ember data computed ember.js

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); } });