WS: improve Observable implementation
This commit is contained in:
parent
842b989e19
commit
1369076c14
@ -30,8 +30,12 @@ export class Component extends Observable {
|
||||
return this._channel;
|
||||
}
|
||||
|
||||
on (property, callback) {
|
||||
this.addObserver(property, (self) => callback(self[property]));
|
||||
on (event, callback) {
|
||||
this.addObserver(event, callback);
|
||||
}
|
||||
|
||||
notify (property) {
|
||||
this.notifyObservers(property, this['_' + property]);
|
||||
}
|
||||
|
||||
send (node, addr, val) {
|
||||
@ -48,7 +52,7 @@ export class Component extends Observable {
|
||||
|
||||
updateLocal (property, value) {
|
||||
this['_' + property] = value;
|
||||
this.notifyObservers(property);
|
||||
this.notify(property);
|
||||
}
|
||||
|
||||
updateRemote (property, value, node, addr) {
|
||||
|
@ -22,41 +22,40 @@ export default class Observable {
|
||||
this._observers = {};
|
||||
}
|
||||
|
||||
addObserver (property, observer) {
|
||||
// property=undefined means the caller is interested in observing all properties
|
||||
if (!(property in this._observers)) {
|
||||
this._observers[property] = [];
|
||||
addObserver (event, observer) {
|
||||
// event=undefined means the caller is interested in observing all events
|
||||
if (!(event in this._observers)) {
|
||||
this._observers[event] = [];
|
||||
}
|
||||
|
||||
this._observers[property].push(observer);
|
||||
this._observers[event].push(observer);
|
||||
}
|
||||
|
||||
removeObserver (property, observer) {
|
||||
// property=undefined means the caller is not interested in any property anymore
|
||||
if (typeof(property) == 'undefined') {
|
||||
for (const property in this._observers) {
|
||||
this.removeObserver(property, observer);
|
||||
removeObserver (event, observer) {
|
||||
// event=undefined means the caller is not interested in any event anymore
|
||||
if (typeof(event) == 'undefined') {
|
||||
for (const event in this._observers) {
|
||||
this.removeObserver(event, observer);
|
||||
}
|
||||
} else {
|
||||
const index = this._observers[property].indexOf(observer);
|
||||
|
||||
const index = this._observers[event].indexOf(observer);
|
||||
if (index > -1) {
|
||||
this._observers[property].splice(index, 1);
|
||||
this._observers[event].splice(index, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
notifyObservers (property) {
|
||||
// always notify observers that observe all properties
|
||||
notifyObservers (event, ...args) {
|
||||
// always notify observers that observe all events
|
||||
if (undefined in this._observers) {
|
||||
for (const observer of this._observers[undefined]) {
|
||||
observer(this, property);
|
||||
observer(event, ...args);
|
||||
}
|
||||
}
|
||||
|
||||
if (property in this._observers) {
|
||||
for (const observer of this._observers[property]) {
|
||||
observer(this);
|
||||
if (event in this._observers) {
|
||||
for (const observer of this._observers[event]) {
|
||||
observer(...args);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -45,7 +45,7 @@ export default class Mixer extends Component {
|
||||
if (node.startsWith('strip')) {
|
||||
if (node == StateNode.STRIP_DESCRIPTION) {
|
||||
this._strips[addr] = new Strip(this, addr, val);
|
||||
this.notifyObservers('strips');
|
||||
this.notify('strips');
|
||||
return true;
|
||||
} else {
|
||||
const stripAddr = [addr[0]];
|
||||
|
@ -53,7 +53,7 @@ export default class Plugin extends AddressableComponent {
|
||||
if (node.startsWith('strip_plugin_param')) {
|
||||
if (node == StateNode.STRIP_PLUGIN_PARAM_DESCRIPTION) {
|
||||
this._parameters[addr] = new Parameter(this, addr, val);
|
||||
this.notifyObservers('parameters');
|
||||
this.notify('parameters');
|
||||
return true;
|
||||
} else {
|
||||
if (addr in this._parameters) {
|
||||
|
@ -84,7 +84,7 @@ export default class Strip extends AddressableComponent {
|
||||
if (node.startsWith('strip_plugin')) {
|
||||
if (node == StateNode.STRIP_PLUGIN_DESCRIPTION) {
|
||||
this._plugins[addr] = new Plugin(this, addr, val);
|
||||
this.notifyObservers('plugins');
|
||||
this.notify('plugins');
|
||||
return true;
|
||||
} else {
|
||||
const pluginAddr = [addr[0], addr[1]];
|
||||
|
Loading…
Reference in New Issue
Block a user