##// END OF EJS Templates
Working sandbox
Working sandbox

File last commit:

r98:12074cb11473 v1.3
r99:908c1ce6ce6d v1.3
Show More
WatchRendition.ts
55 lines | 1.5 KiB | video/mp2t | TypeScriptLexer
/ djx / src / main / ts / tsx / WatchRendition.ts
import { id as mid } from "module";
import { TraceSource } from "@implab/core-amd/log/TraceSource";
import { argumentNotNull } from "@implab/core-amd/safe";
import { getItemDom, render } from "./render";
import { RenditionBase } from "./RenditionBase";
import { IScope, Scope } from "./Scope";
import { Observable } from "../observable";
const trace = TraceSource.get(mid);
export class WatchRendition<T> extends RenditionBase<Node> {
private readonly _component: (arg: T) => unknown;
private _node: Node;
private readonly _scope = new Scope();
private readonly _subject: Observable<T>;
constructor(component: (arg: T) => unknown, subject: Observable<T>) {
super();
argumentNotNull(component, "component");
this._component = component;
this._subject = subject;
this._node = document.createComment("WatchRendition placeholder");
}
protected _create(attrs: object, children: any[], scope: IScope) {
scope.own(this._scope);
scope.own(this._subject.on({ next: this._onValue }));
}
private _onValue = (value: T) =>
void this._render(value).catch( e => trace.error(e));
private async _render(value: T) {
const prevNode = this._node;
this._scope.clean();
this._node = await render(this._component(value), this._scope);
this.placeAt(prevNode, "replace");
}
protected _getDomNode() {
if (!this._node)
throw new Error("The instance of the widget isn't created");
return this._node;
}
}