##// END OF EJS Templates
Added priorities to render tasks, revisited rendering scheduler...
Added priorities to render tasks, revisited rendering scheduler nested `watch` and `watchFor` has a lower priority then they enclosing renditions

File last commit:

r146:af4f8424e83d v1.9.0 default
r146:af4f8424e83d v1.9.0 default
Show More
WatchRendition.ts
93 lines | 2.6 KiB | video/mp2t | TypeScriptLexer
/ djx / src / main / ts / tsx / WatchRendition.ts
cin
Added Renderer, WatchRendition
r94 import { argumentNotNull } from "@implab/core-amd/safe";
cin
Added priorities to render tasks, revisited rendering scheduler...
r146 import { queueRenderTask, getItemDom, getPriority, getScope } 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
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;
cin
Added priorities to render tasks, revisited rendering scheduler...
r146 private _priority = 0;
cin
`Subscribable` is made compatible with rxjs, added map, filter and scan...
r102 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
Added priorities to render tasks, revisited rendering scheduler...
r146 this._priority = getPriority() + 1;
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 };
cin
Added priorities to render tasks, revisited rendering scheduler...
r146 queueRenderTask(this._render, this._scope, this._priority);
cin
`Subscribable` is made compatible with rxjs, added map, filter and scan...
r102 } else {
// update existing job
this._renderJob = { value };
}
cin
Working on WatchForRendition
r107 };
cin
Added Renderer, WatchRendition
r94
cin
Added priorities to render tasks, revisited rendering scheduler...
r146 private readonly _render = () => {
// don't render destroyed rendition
if (this._ct.isRequested())
return;
cin
`Subscribable` is made compatible with rxjs, added map, filter and scan...
r102
cin
Added priorities to render tasks, revisited rendering scheduler...
r146 // remove all previous content
this._scope.clean();
cin
refactoring, adding scope to rendering methods
r96
cin
Added priorities to render tasks, revisited rendering scheduler...
r146 // render the new node
const node = getItemDom(this._renderJob ? this._component(this._renderJob.value) : undefined);
cin
`Subscribable` is made compatible with rxjs, added map, filter and scan...
r102
cin
Added priorities to render tasks, revisited rendering scheduler...
r146 // get actual content
const pending = isDocumentFragmentNode(node) ?
collectNodes(node.childNodes) :
[node];
cin
`Subscribable` is made compatible with rxjs, added map, filter and scan...
r102
cin
Added priorities to render tasks, revisited rendering scheduler...
r146 placeAt(node, this._node, "after");
cin
`Subscribable` is made compatible with rxjs, added map, filter and scan...
r102
cin
Added priorities to render tasks, revisited rendering scheduler...
r146 if (isMounted(this._node))
pending.forEach(n => startupWidgets(n));
cin
`Subscribable` is made compatible with rxjs, added map, filter and scan...
r102
cin
Added priorities to render tasks, revisited rendering scheduler...
r146 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;
}
}