Dependiendo de cuál sea el predicado, es posible que pueda adaptar su problema a una implementación del observer pattern. Hace un tiempo escribí una publicación en el blog sobre creating JavaScript objects with observable properties. Realmente depende de lo que el predicado es , pero esto podría conseguir que la mayor parte del camino con el código como este:
var observable = createObservable({ propToWatch: false });
observable.observe('propToWatch', function (oldValue, newValue) {
alert('propToWatch has changed from ' + oldValue + ' to ' + newValue);
});
observable.propToWatch(true); // alert pops
Por supuesto, esto podría ser excesiva para tu ejemplo. Ya que nunca aparece en la lista explícitamente (nota: No soy un muy buen blogger), aquí está el código completo necesario para hacer este trabajo:
var createMediator = function() {
var events = {};
return {
subscribe: function (eventName, callback) {
events[eventName] = events[eventName] || [];
events[eventName].push(callback);
},
publish: function (eventName) {
var i, callbacks = events[eventName], args;
if (callbacks) {
args = Array.prototype.slice.call(arguments, 1);
for (i = 0; i < callbacks.length; i++) {
callbacks[i].apply(null, args);
}
}
}
};
};
var createObservable = function (properties) {
var notifier = createMediator(), createObservableProperty, observable;
createObservableProperty = function (propName, value) {
return function (newValue) {
var oldValue;
if (typeof newValue !== 'undefined' &&
value !== newValue) {
oldValue = value;
value = newValue;
notifier.publish(propName, oldValue, value);
}
return value;
};
};
observable = {
register: function (propName, value) {
this[propName] = createObservableProperty(propName, value);
this.observableProperties.push(propName);
},
observe: function (propName, observer) {
notifier.subscribe(propName, observer);
},
observableProperties: []
};
for (propName in properties) {
observable.register(propName, properties[propName]);
}
return observable;
};
Mis objetos observables hacen uso interno de un (la función createMediator) Marco concurso completo pequeña Escribí una vez para un proyecto. (Antes de realizando eventos personalizados compatibles con jQuery. D'oh!) De nuevo, esto puede ser excesivo o no para su necesidad, pero pensé que era un hack divertido. ¡Disfrutar!
¿Cuál es el predicado? – SLaks
@predicate es función, la acción también es función – zaharpopov
El predicado es la condición cuando eso tiene que ser cierto antes de que se llame a la acción. ** ==> ** Me parece bien. – AxelEckenberger