-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathframework.js
65 lines (54 loc) · 1.47 KB
/
framework.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
"use strict";
export async function request(resource, options) {
let response = await fetch(resource, options);
if (response.ok) return response; else throw response;
}
export function htmlToElement(html) {
let template = document.createElement('template');
template.innerHTML = html.trim();
return template.content.firstChild;
}
export class AuxEvent {
constructor() {
this.event = new EventTarget();
this.aux = new Event('e');
}
addListener(element, callback) {
let event = this.event;
if (element.myCallbacks) element.myCallbacks.push(callback);
else element.myCallbacks = [callback];
let references = [new WeakRef(element), new WeakRef(callback)];
event.addEventListener('e', function listener() {
let [myElement, myCallback] = references.map(reference => reference.deref());
if (myElement && myCallback)
if (document.contains(myElement)) myCallback();
else
event.removeEventListener('e', listener);
});
}
addGlobalListener(callback) {
this.event.addEventListener('e', callback);
}
dispatch() {
this.event.dispatchEvent(this.aux);
}
}
export class Observable {
constructor(initialValue) {
this.variable = initialValue;
this.event = new AuxEvent();
}
get value() {
return this.variable;
}
set value(newValue) {
this.variable = newValue;
this.event.dispatch();
}
subscribe(element, callback) {
this.event.addListener(element, callback);
}
addGlobalListener(callback) {
this.event.addGlobalListener(callback);
}
}