##// END OF EJS Templates
fixed NlsBundle locale package loading...
fixed NlsBundle locale package loading corrected DjxFragment params and return value fixed regression in DjxWidgetBase attach points processing fixed empty RenditionBase startup

File last commit:

r107:e59104632d14 default
r112:2ccfaae984e9 v1.4.4 default
Show More
WatchRendition.ts
97 lines | 2.7 KiB | video/mp2t | TypeScriptLexer
/ djx / src / main / ts / tsx / WatchRendition.ts
cin
Added Renderer, WatchRendition
r94 import { id as mid } from "module";
import { TraceSource } from "@implab/core-amd/log/TraceSource";
import { argumentNotNull } from "@implab/core-amd/safe";
cin
Testing nested watch, release candidate
r101 import { getScope, render } from "./render";
cin
Added Renderer, WatchRendition
r94 import { RenditionBase } from "./RenditionBase";
cin
Testing nested watch, release candidate
r101 import { Scope } from "./Scope";
cin
`Subscribable` is made compatible with rxjs, added map, filter and scan...
r102 import { Subscribable } from "../observable";
import { Cancellation } from "@implab/core-amd/Cancellation";
import { collectNodes, destroy, isDocumentFragmentNode, isMounted, placeAt, startupWidgets } from "./traits";
cin
Added Renderer, WatchRendition
r94
const trace = TraceSource.get(mid);
export class WatchRendition<T> extends RenditionBase<Node> {
cin
file rename
r98 private readonly _component: (arg: T) => unknown;
cin
Added Renderer, WatchRendition
r94
cin
`Subscribable` is made compatible with rxjs, added map, filter and scan...
r102 private readonly _node: Node;
cin
Added Renderer, WatchRendition
r94
private readonly _scope = new Scope();
cin
`Subscribable` is made compatible with rxjs, added map, filter and scan...
r102 private readonly _subject: Subscribable<T>;
private _renderJob?: { value: T };
cin
refactoring, adding scope to rendering methods
r96
cin
`Subscribable` is made compatible with rxjs, added map, filter and scan...
r102 private _ct = Cancellation.none;
constructor(component: (arg: T) => unknown, subject: Subscribable<T>) {
cin
Added Renderer, WatchRendition
r94 super();
argumentNotNull(component, "component");
cin
file rename
r98 this._component = component;
cin
Added Renderer, WatchRendition
r94
cin
refactoring, adding scope to rendering methods
r96 this._subject = subject;
cin
`Subscribable` is made compatible with rxjs, added map, filter and scan...
r102 this._node = document.createComment("[Watch]");
cin
Added Renderer, WatchRendition
r94 }
cin
`Subscribable` is made compatible with rxjs, added map, filter and scan...
r102 protected _create() {
cin
Testing nested watch, release candidate
r101 const scope = getScope();
cin
`Subscribable` is made compatible with rxjs, added map, filter and scan...
r102 scope.own(() => {
this._scope.destroy();
destroy(this._node);
});
scope.own(this._subject.subscribe({ next: this._onValue }));
this._ct = new Cancellation(cancel => scope.own(cancel));
}
cin
Working on WatchForRendition
r107 private readonly _onValue = (value: T) => {
cin
`Subscribable` is made compatible with rxjs, added map, filter and scan...
r102 if (!this._renderJob) {
// schedule a new job
this._renderJob = { value };
this._render().catch(e => trace.error(e));
} else {
// update existing job
this._renderJob = { value };
}
cin
Working on WatchForRendition
r107 };
cin
Added Renderer, WatchRendition
r94
cin
`Subscribable` is made compatible with rxjs, added map, filter and scan...
r102 private async _render() {
// fork
await Promise.resolve();
// don't render destroyed rendition
if (this._ct.isRequested())
return;
// remove all previous content
this._scope.clean();
cin
refactoring, adding scope to rendering methods
r96
cin
`Subscribable` is made compatible with rxjs, added map, filter and scan...
r102 // render the new node
const node = render(
this._renderJob ? this._component(this._renderJob.value) : undefined,
this._scope
);
// get actual content
const pending = isDocumentFragmentNode(node) ?
collectNodes(node.childNodes) :
[node];
placeAt(node, this._node, "after");
if (isMounted(this._node))
pending.forEach(n => startupWidgets(n));
if (pending.length)
this._scope.own(() => pending.forEach(destroy));
this._renderJob = undefined;
cin
Added Renderer, WatchRendition
r94 }
protected _getDomNode() {
if (!this._node)
throw new Error("The instance of the widget isn't created");
return this._node;
}
}