Skip to content

Commit e59a543

Browse files
committed
refactor(renderer): patch every View with ViewExtensions
When a View is passed through the renderer on insert/remove it's patched with ViewExtensions for its class. That is done for parent views and for child views. fixes #978
1 parent 2ca6579 commit e59a543

File tree

1 file changed

+41
-15
lines changed

1 file changed

+41
-15
lines changed

Diff for: nativescript-angular/view-util.ts

+41-15
Original file line numberDiff line numberDiff line change
@@ -51,24 +51,30 @@ export class ViewUtil {
5151
}
5252

5353
public insertChild(
54-
parent: NgView,
55-
child: NgView,
56-
previous: NgView = parent.lastChild,
54+
parent: View,
55+
child: View,
56+
previous?: NgView,
5757
next?: NgView
5858
) {
5959
if (!parent) {
6060
return;
6161
}
6262

63-
this.addToQueue(parent, child, previous, next);
63+
const extendedParent = this.ensureNgViewExtensions(parent);
64+
const extendedChild = this.ensureNgViewExtensions(child);
65+
66+
if (!previous) {
67+
previous = extendedParent.lastChild;
68+
}
69+
this.addToQueue(extendedParent, extendedChild, previous, next);
6470

6571
if (isInvisibleNode(child)) {
66-
child.templateParent = parent;
72+
extendedChild.templateParent = extendedParent;
6773
}
6874

6975
if (!isDetachedElement(child)) {
7076
const nextVisual = this.findNextVisual(next);
71-
this.addToVisualTree(parent, child, nextVisual);
77+
this.addToVisualTree(extendedParent, extendedChild, nextVisual);
7278
}
7379
}
7480

@@ -145,15 +151,18 @@ export class ViewUtil {
145151
return next;
146152
}
147153

148-
public removeChild(parent: NgView, child: NgView) {
154+
public removeChild(parent: View, child: View) {
149155
traceLog(`ViewUtil.removeChild parent: ${parent} child: ${child}`);
150156

151157
if (!parent) {
152158
return;
153159
}
154160

155-
this.removeFromQueue(parent, child);
156-
this.removeFromVisualTree(parent, child);
161+
const extendedParent = this.ensureNgViewExtensions(parent);
162+
const extendedChild = this.ensureNgViewExtensions(child);
163+
164+
this.removeFromQueue(extendedParent, extendedChild);
165+
this.removeFromVisualTree(extendedParent, extendedChild);
157166
}
158167

159168
private removeFromQueue(parent: NgView, child: NgView) {
@@ -257,16 +266,34 @@ export class ViewUtil {
257266
}
258267

259268
const viewClass = getViewClass(name);
260-
let view = <NgView>new viewClass();
261-
view.nodeName = name;
262-
view.meta = getViewMeta(name);
269+
const view = <NgView>new viewClass();
270+
const ngView = this.setNgViewExtensions(view, name);
271+
272+
return ngView;
273+
}
274+
275+
private ensureNgViewExtensions(view: View): NgView {
276+
if (view.hasOwnProperty("meta")) {
277+
return view as NgView;
278+
} else {
279+
const name = view.typeName;
280+
const ngView = this.setNgViewExtensions(view, name);
281+
282+
return ngView;
283+
}
284+
}
285+
286+
private setNgViewExtensions(view: View, name: string): NgView {
287+
const ngView = view as NgView;
288+
ngView.nodeName = name;
289+
ngView.meta = getViewMeta(name);
263290

264291
// we're setting the node type of the view
265292
// to 'element' because of checks done in the
266293
// dom animation engine
267-
view.nodeType = ELEMENT_NODE_TYPE;
294+
ngView.nodeType = ELEMENT_NODE_TYPE;
268295

269-
return view;
296+
return ngView;
270297
}
271298

272299
public setProperty(view: NgView, attributeName: string, value: any, namespace?: string): void {
@@ -382,4 +409,3 @@ export class ViewUtil {
382409
view.style[styleName] = unsetValue;
383410
}
384411
}
385-

0 commit comments

Comments
 (0)