@web-native-js/observer
Version:
A simple set of functions for intercepting and observing JavaScript objects and arrays.
51 lines (46 loc) • 1.29 kB
JavaScript
/**
* @imports
*/
import _arrFrom from '@webqit/util/arr/from.js';
import _remove from '@webqit/util/arr/remove.js';
import Firebase from '../Firebase.js';
import Observer from './Observer.js';
import Delta from './Delta.js';
import Event from './Event.js';
/**
* ---------------------------
* The Reactive class
* ---------------------------
*/
export default class extends Firebase {
/**
* @inheritdoc
*/
add(dfn) {
return super.add(new Observer(this.subject, dfn));
}
/**
* Fires all observers with the given evt (change).
*
* @param array|Delta changes
*
* @return Event
*/
fire(changes) {
var evt = new Event(this.subject);
// We accept multiple changes
changes = _arrFrom(changes, false).map(delta => !(delta instanceof Delta) ? new Delta(this.subject, delta) : delta);
if (this.currentlyFiring.filter(d => changes.filter(delta => d.type === delta.type && d.name === delta.name).length).length) {
//return false;
}
this.currentlyFiring.push(...changes);
this.fireables.forEach(observer => {
if (evt.propagationStopped) {
return evt;
}
evt.respond(observer.fire(changes));
});
changes.forEach(delta => _remove(this.currentlyFiring, delta));
return evt;
}
};