54 lines
1007 B
JavaScript
54 lines
1007 B
JavaScript
|
export class StateProvider extends HTMLElement {
|
||
|
constructor() {
|
||
|
super()
|
||
|
this.appendChild(document.createElement('slot'))
|
||
|
this.observers = []
|
||
|
}
|
||
|
|
||
|
connectedCallback() {
|
||
|
this.value = this.getAttribute('value')
|
||
|
}
|
||
|
|
||
|
get name() {
|
||
|
return this.getAttribute('name')
|
||
|
}
|
||
|
|
||
|
get value() {
|
||
|
return this._val
|
||
|
}
|
||
|
|
||
|
set value(newValue) {
|
||
|
// if (this.value !== newValue) {
|
||
|
this._val = newValue
|
||
|
this.notifyObservers()
|
||
|
// }
|
||
|
}
|
||
|
|
||
|
static get observedAttributes() {
|
||
|
return ['value']
|
||
|
}
|
||
|
|
||
|
attributeChangedCallback(name, oldValue, newValue) {
|
||
|
// console.log('attrChange', name, oldValue, newValue)
|
||
|
if (name === 'value') {
|
||
|
this.value = newValue
|
||
|
}
|
||
|
}
|
||
|
|
||
|
notifyObservers() {
|
||
|
for (let obs of this.observers) {
|
||
|
obs.update(this)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
addObserver(obs) {
|
||
|
this.observers.push(obs)
|
||
|
}
|
||
|
|
||
|
removeObserver(obs) {
|
||
|
this.observers = this.observers.filter(el => el !== obs)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
window.customElements.define('state-provider', StateProvider)
|