Skip to content

Commit c0ec870

Browse files
committed
fix(renderer): implement createComment and createText methods using
Placeholders. - createComment - create new element "Comment" using ui/placeholder and attach it. These comments are used as anchors (nextSibling) for structural directives such as *ngIf and *ngFor. - createText - create new element "DetachedText" using ui/placeholder and don't attach it.
1 parent b397602 commit c0ec870

File tree

3 files changed

+53
-39
lines changed

3 files changed

+53
-39
lines changed

Diff for: nativescript-angular/element-registry.ts

+8-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { View } from "ui/core/view";
22

33
export type ViewResolver = () => ViewClass;
44
export type NgView = View & ViewExtensions;
5-
export const TEMPLATE = "template";
5+
export const TEMPLATE = "ng-template";
66

77
export interface ViewClassMeta {
88
skipAddToDom?: boolean;
@@ -117,3 +117,10 @@ registerElement("Span", () => require("text/span").Span);
117117

118118
registerElement("DetachedContainer", () => require("ui/proxy-view-container").ProxyViewContainer,
119119
{ skipAddToDom: true });
120+
121+
registerElement("DetachedText", () => require("ui/placeholder").Placeholder,
122+
{ skipAddToDom: true });
123+
124+
registerElement("Comment", () => require("ui/placeholder").Placeholder,
125+
{ skipAddToDom: false });
126+

Diff for: nativescript-angular/renderer.ts

+15-15
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,21 @@ export class NativeScriptRenderer extends RendererV2 {
119119
return this.viewUtil.nextSiblingIndex(node);
120120
}
121121

122+
createComment(_value: any) {
123+
traceLog(`NativeScriptRenderer.createComment ${_value}`);
124+
return this.viewUtil.createComment();
125+
}
126+
127+
createElement(name: any, _namespace: string): NgView {
128+
traceLog(`NativeScriptRenderer.createElement: ${name}`);
129+
return this.viewUtil.createView(name);
130+
}
131+
132+
createText(_value: string) {
133+
traceLog(`NativeScriptRenderer.createText ${_value}`);
134+
return this.viewUtil.createText();
135+
}
136+
122137
createViewRoot(hostElement: NgView): NgView {
123138
traceLog(`NativeScriptRenderer.createViewRoot ${hostElement.nodeName}`);
124139
return hostElement;
@@ -134,11 +149,6 @@ export class NativeScriptRenderer extends RendererV2 {
134149
// Seems to be called on component dispose only (router outlet)
135150
// TODO: handle this when we resolve routing and navigation.
136151
}
137-
138-
createComment(_value: any) {
139-
traceLog(`NativeScriptRenderer.createComment ${_value}`);
140-
}
141-
142152
setAttribute(view: NgView, name: string, value: string) {
143153
traceLog(`NativeScriptRenderer.setAttribute ${view} : ${name} = ${value}`);
144154
return this.setProperty(view, name, value);
@@ -192,16 +202,6 @@ export class NativeScriptRenderer extends RendererV2 {
192202
traceLog("NativeScriptRenderer.setValue");
193203
}
194204

195-
createElement(name: any, _namespace: string): NgView {
196-
traceLog(`NativeScriptRenderer.createElement: ${name}`);
197-
return this.viewUtil.createView(name);
198-
}
199-
200-
createText(_value: string) {
201-
traceLog("NativeScriptRenderer.createText");
202-
return this.viewUtil.createText();
203-
}
204-
205205
listen(renderElement: any, eventName: string, callback: (event: any) => boolean):
206206
() => void {
207207
traceLog("NativeScriptRenderer.listen: " + eventName);

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

+30-23
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ export class ViewUtil {
5656
}
5757

5858
public insertChild(parent: any, child: NgView, atIndex: number = -1) {
59-
if (!parent || child.meta.skipAddToDom || isPlaceholder(child) === true) {
59+
if (!parent || child.meta.skipAddToDom) {
6060
return;
6161
}
6262

@@ -123,8 +123,24 @@ export class ViewUtil {
123123
}
124124
}
125125

126+
public createComment(): NgView {
127+
const commentView = this.createView("Comment");
128+
commentView.nodeName = "#comment";
129+
commentView.visibility = "collapse";
130+
131+
return commentView;
132+
}
133+
134+
public createText(): NgView {
135+
const detachedText = this.createView("DetachedText");
136+
detachedText.nodeName = "#text";
137+
detachedText.visibility = "collapse";
138+
139+
return detachedText;
140+
}
141+
126142
public createView(name: string): NgView {
127-
traceLog("Creating view:" + name);
143+
traceLog(`Creating view: ${name}`);
128144

129145
if (!isKnownView(name)) {
130146
name = "ProxyViewContainer";
@@ -137,14 +153,6 @@ export class ViewUtil {
137153
return view;
138154
}
139155

140-
public createText(): NgView {
141-
const text = <NgView>new Placeholder();
142-
text.nodeName = "#text";
143-
text.visibility = "collapse";
144-
text.meta = getViewMeta("Placeholder");
145-
return text;
146-
}
147-
148156
private isXMLAttribute(name: string): boolean {
149157
return XML_ATTRIBUTES.indexOf(name) !== -1;
150158
}
@@ -204,23 +212,22 @@ export class ViewUtil {
204212
// returns -1 if the node has no parent or next sibling
205213
public nextSiblingIndex(node: NgView): number {
206214
const parent = node.parent;
207-
208215
if (!parent) {
209216
return -1;
210-
} else {
211-
let index = 0;
212-
let found = false;
213-
parent.eachChild(child => {
214-
if (child === node) {
215-
found = true;
216-
}
217+
}
217218

218-
index += 1;
219-
return !found;
220-
});
219+
let index = 0;
220+
let found = false;
221+
parent.eachChild(child => {
222+
if (child === node) {
223+
found = true;
224+
}
221225

222-
return found ? index : -1;
223-
}
226+
index += 1;
227+
return !found;
228+
});
229+
230+
return found ? index : -1;
224231
}
225232

226233
private setPropertyInternal(view: NgView, attributeName: string, value: any): void {

0 commit comments

Comments
 (0)