object - eliminar elemento de un objeto javascript
¿Cómo observar todos los cambios de propiedad del objeto? (3)
Para las matrices, sé que puedes hacer algo como esto:
function() {
}.observes("array.@each")
Lo que hice fue convertir el objeto en una matriz y observar las propiedades con @each, pero ¿hay una mejor manera de observar el objeto todos los cambios de propiedad sin convertirlo en una matriz?
Puede observar isDirty
para ver si alguno de los valores del objeto se ha modificado desde la última vez que guardó (si está utilizando Ember Data).
Alternativamente, puede pasar una lista de propiedades separadas por comas a los observes
. Esto puede ser largo si tiene muchas propiedades en su objeto, pero funcionará.
Un tercer enfoque podría ser anular setUnknownProperty()
y establecer una propiedad, una ''bandera sucia'' (o realizar cualquier acción que desee allí.
También hay una publicación de SO antigua que da la siguiente respuesta:
App.WatchedObject = Ember.Object.extend({
firstProp: null,
secondProp: "bar",
init: function(){
this._super();
var self = this;
Ember.keys(this).forEach(function(key){
if(Ember.typeOf(self.get(key)) !== ''function''){
self.addObserver(key, function(){
console.log(self.get(key));
});
}
});
}
});
Probablemente puedas dividir esto en un Mixin para mantener tu código SECO.
Puede obtener una lista de propiedades en un objeto y aplicarlas a una nueva propiedad:
attrs = Ember.keys(observedObject);
var c = Ember.computed(function() {
// Do stuff when something changes
})
Ember.defineProperty(target, propertyName, c.property.apply(c, attrs));
Aquí hay un jsbin que funciona. Crear un observador en lugar de una propiedad debería ser posible usando un enfoque similar.
probablemente podría crear algo así como una blabbermouth
y anular el método set
para recibir notificaciones de cambios en la propiedad:
App.BlabbermouthMixin = Ember.Mixin.create({
set: function(keyName, value) {
this.set(''updatedProperty'', keyName);
this._super(keyName, value);
}
});
y observe la propiedad de updatedProperty
?