A seconda del predicato, potresti essere in grado di adattare il problema a un'implementazione di observer pattern. Qualche tempo fa ho scritto un post sul blog su creating JavaScript objects with observable properties. Dipende da cosa predicato è, ma questo potrebbe ottenere la maggior parte del tragitto con il codice come questo:
var observable = createObservable({ propToWatch: false });
observable.observe('propToWatch', function (oldValue, newValue) {
alert('propToWatch has changed from ' + oldValue + ' to ' + newValue);
});
observable.propToWatch(true); // alert pops
Naturalmente, questo potrebbe essere eccessivo per il tuo esempio. Dal momento che non è mai elencato esplicitamente (nb io non sono un buon blogger), ecco il codice completo necessario per fare questo lavoro:
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;
};
miei oggetti osservabili fanno uso interno di un piccolo quadro eventing (la funzione createMediator) Ho scritto una volta per un progetto. (Prima di realizzando eventi personalizzati supportati da jQuery. D'oh!) Ancora una volta, questo potrebbe o non potrebbe essere eccessivo per le tue necessità, ma ho pensato che fosse un trucco divertente. Godere!
fonte
2010-02-19 14:01:37
Qual è il predicato? – SLaks
@predicate è la funzione, l'azione è anche la funzione – zaharpopov
Il predicato è la condizione in cui deve essere true prima che l'azione venga chiamata. ** ==> ** Sembra sano per me. – AxelEckenberger