Remove ref from render (can be implemented externally)
This commit is contained in:
parent
7e397d8029
commit
9bc3ce6ae7
1 changed files with 0 additions and 42 deletions
42
render.js
42
render.js
|
@ -100,47 +100,6 @@ export const noDefault = fn => event => { event.preventDefault(); return fn(even
|
||||||
*/
|
*/
|
||||||
export const noPropagate = fn => event => { event.stopPropagation(); return fn(event) }
|
export const noPropagate = fn => event => { event.stopPropagation(); return fn(event) }
|
||||||
|
|
||||||
|
|
||||||
/** A reference to an element that follows it around through replacements */
|
|
||||||
export class Ref {
|
|
||||||
/** @type {WeakMap<Text|Element,Text|Element>} */
|
|
||||||
static #map = new WeakMap()
|
|
||||||
|
|
||||||
/** @type {Element|Text} */
|
|
||||||
#element
|
|
||||||
|
|
||||||
/** @param {Element|Text} element */
|
|
||||||
constructor(element) {
|
|
||||||
this.#element = element
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @return {Element|Text} */
|
|
||||||
deref() {
|
|
||||||
const next = Ref.newer(this.#element)
|
|
||||||
if (next) {
|
|
||||||
this.#element = next
|
|
||||||
return this.deref()
|
|
||||||
} else {
|
|
||||||
return this.#element
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @param {Element|Text} element */
|
|
||||||
static newer(element) {
|
|
||||||
return this.#map.get(element)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {Element|Text} previous
|
|
||||||
* @param {Element|Text} next
|
|
||||||
*/
|
|
||||||
static replace(previous, next) {
|
|
||||||
if (this.newer(previous))
|
|
||||||
throw "Element has already been replaced with newer one"
|
|
||||||
this.#map.set(previous, next)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Main class doing all the rendering */
|
/** Main class doing all the rendering */
|
||||||
export class Renderer {
|
export class Renderer {
|
||||||
static proxy() {
|
static proxy() {
|
||||||
|
@ -263,7 +222,6 @@ export class DomRenderer extends Renderer {
|
||||||
const next = this.toElement(observable.value)
|
const next = this.toElement(observable.value)
|
||||||
if (element?.dispatchEvent(new BeforeReplaceEvent(next))) {
|
if (element?.dispatchEvent(new BeforeReplaceEvent(next))) {
|
||||||
element.replaceWith(next)
|
element.replaceWith(next)
|
||||||
Ref.replace(element, next)
|
|
||||||
next.dispatchEvent(new ReplacedEvent(element))
|
next.dispatchEvent(new ReplacedEvent(element))
|
||||||
element.dispatchEvent(new AfterReplaceEvent(next))
|
element.dispatchEvent(new AfterReplaceEvent(next))
|
||||||
ref = new WeakRef(next)
|
ref = new WeakRef(next)
|
||||||
|
|
Loading…
Reference in a new issue