##// END OF EJS Templates
Fixed startup of DjxWidgetBase to start inner widgets...
cin -
r52:0b9593714536 default
parent child
Show More
@@ -40,7 +40,7 class DomInject {
40 40
41 41 const noerr = on(node, "error", e => {
42 42 fail({
43 erorr: e,
43 error: e,
44 44 node
45 45 });
46 46 cleanup();
@@ -1,7 +1,7
1 1 import { djbase, djclass } from "../declare";
2 2 import _WidgetBase = require("dijit/_WidgetBase");
3 3 import _AttachMixin = require("dijit/_AttachMixin");
4 import { BuildContext, isNode } from "./traits";
4 import { BuildContext, isNode, startupWidgets } from "./traits";
5 5 import registry = require("dijit/registry");
6 6
7 7 // type Handle = dojo.Handle;
@@ -66,4 +66,12 export abstract class DjxWidgetBase<Attr
66 66 }
67 67 return super._processTemplateNode(baseNode, getAttrFunc, attachFunc);
68 68 }
69
70 /** Starts current widget and all its supporting widgets (placed outside
71 * `containerNode`) and child widgets (placed inside `containerNode`)*/
72 startup() {
73 // startup supporting widgets
74 startupWidgets(this.domNode, this.containerNode);
75 super.startup();
69 76 }
77 }
@@ -1,8 +1,6
1 1 import dom = require("dojo/dom-construct");
2 import attr = require("dojo/dom-attr");
3 2 import { argumentNotEmptyString } from "@implab/core-amd/safe";
4 3 import { BuildContextBase } from "./BuildContextBase";
5 import registry = require("dijit/registry");
6 4
7 5 export class HtmlElementContext extends BuildContextBase<HTMLElement> {
8 6 elementType: string;
@@ -1,4 +1,8
1 import { IDestroyable } from "@implab/core-amd/interfaces";
2 import { isDestroyable } from "@implab/core-amd/safe";
1 3 import _WidgetBase = require("dijit/_WidgetBase");
4 import registry = require("dijit/registry");
5 import dom = require("dojo/dom-construct");
2 6
3 7 type _WidgetBaseConstructor = typeof _WidgetBase;
4 8
@@ -10,6 +14,10 export interface BuildContext<TNode exte
10 14 placeAt(refNode: string | Node, position?: DojoNodePosition): void;
11 15 }
12 16
17 export interface IRecursivelyDestroyable {
18 destroyRecursive(): void;
19 }
20
13 21 export function isNode(el: any): el is Node {
14 22 return el && el.nodeName && el.nodeType;
15 23 }
@@ -71,3 +79,52 export function isWidgetConstructor(v: a
71 79 export function isInPage(node: Node) {
72 80 return (node === document.body) ? false : document.body.contains(node);
73 81 }
82
83 export function isRecursivelyDestroyable(target: any): target is IRecursivelyDestroyable {
84 return target && typeof target.destroyRecursive === "function";
85 }
86
87
88 /** Destroys DOM Node with all contained widgets.
89 * If the specified node is the root node of a widget, then the
90 * widget will be destroyed.
91 *
92 * @param target DOM Node or widget to destroy
93 */
94 export function destroy(target: Node | IDestroyable | IRecursivelyDestroyable) {
95 if (isRecursivelyDestroyable(target)) {
96 target.destroyRecursive();
97 } else if (isDestroyable(target)) {
98 target.destroy();
99 } else if (isNode(target)) {
100 const self = registry.byNode(target);
101 if (self) {
102 self.destroyRecursive();
103 } else {
104 registry.findWidgets(target).forEach(destroy);
105 dom.destroy(target);
106 }
107 }
108 }
109
110 /** Empties a content of the specified node and destroys all contained widgets.
111 *
112 * @param target DOM node to .
113 */
114 export function emptyNode(target: Node) {
115 registry.findWidgets(target).forEach(destroy);
116 dom.empty(target);
117 }
118
119 /** This function starts all widgets inside the DOM node if the target is a node,
120 * or starts widget itself if the target is the widget.
121 *
122 * @param target DOM node to find and start widgets or the widget itself.
123 */
124 export function startupWidgets(target: Node | _WidgetBase, skipNode?: Node) {
125 if (isNode(target)) {
126 registry.findWidgets(target, skipNode).forEach(w => w.startup());
127 } else {
128 target.startup();
129 }
130 } No newline at end of file
@@ -15,6 +15,7 declare namespace JSX {
15 15 /** specifies handlers map for the events */
16 16 "data-dojo-attach-event": string;
17 17
18 /** @deprecated */
18 19 [attr: string]: any;
19 20 }
20 21
@@ -40,7 +41,23 declare namespace JSX {
40 41
41 42 type ElementAttrType<E, K extends keyof any> = K extends keyof E ? RecursivePartial<E[K]> : string;
42 43
43 type LaxElement<E extends object> = ExcludeMembers<Omit<E, "children">, (...args: any[]) => any> & DjxIntrinsicAttributes;
44
45 type ElementAttrNamesBlacklist = "children" | "getRootNode" | keyof EventTarget;
46
47 /** This type extracts keys of the specified parameter E by the following rule:
48 * 1. skips all ElementAttrNamesBlacklist
49 * 2. skips all methods except with the signature of event handlers
50 */
51 type AssignableElementAttrNames<E> = {
52 [K in keyof E]: K extends ElementAttrNamesBlacklist ? never :
53 ((evt: Event) => any) extends E[K] ? K :
54 E[K] extends ((...args: any[]) => any) ? never :
55 K;
56 }[keyof E];
57
58 type LaxElement<E extends object> =
59 Pick<E, AssignableElementAttrNames<E>> &
60 DjxIntrinsicAttributes;
44 61
45 62 type LaxIntrinsicElementsMap = {
46 63 [tag in keyof HTMLElementTagNameMap]: LaxElement<HTMLElementTagNameMap[tag]>
General Comments 0
You need to be logged in to leave comments. Login now