Skip to content

Commit 0f128ad

Browse files
sis0k0hdeshev
authored andcommitted
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 5890cb6 commit 0f128ad

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 "tns-core-modules/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("tns-core-modules/text/span").Span);
117117

118118
registerElement("DetachedContainer", () => require("tns-core-modules/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
@@ -124,6 +124,21 @@ export class NativeScriptRenderer extends RendererV2 {
124124
return this.viewUtil.nextSiblingIndex(node);
125125
}
126126

127+
createComment(_value: any) {
128+
traceLog(`NativeScriptRenderer.createComment ${_value}`);
129+
return this.viewUtil.createComment();
130+
}
131+
132+
createElement(name: any, _namespace: string): NgView {
133+
traceLog(`NativeScriptRenderer.createElement: ${name}`);
134+
return this.viewUtil.createView(name);
135+
}
136+
137+
createText(_value: string) {
138+
traceLog(`NativeScriptRenderer.createText ${_value}`);
139+
return this.viewUtil.createText();
140+
}
141+
127142
createViewRoot(hostElement: NgView): NgView {
128143
traceLog(`NativeScriptRenderer.createViewRoot ${hostElement.nodeName}`);
129144
return hostElement;
@@ -139,11 +154,6 @@ export class NativeScriptRenderer extends RendererV2 {
139154
// Seems to be called on component dispose only (router outlet)
140155
// TODO: handle this when we resolve routing and navigation.
141156
}
142-
143-
createComment(_value: any) {
144-
traceLog(`NativeScriptRenderer.createComment ${_value}`);
145-
}
146-
147157
setAttribute(view: NgView, name: string, value: string) {
148158
traceLog(`NativeScriptRenderer.setAttribute ${view} : ${name} = ${value}`);
149159
return this.setProperty(view, name, value);
@@ -197,16 +207,6 @@ export class NativeScriptRenderer extends RendererV2 {
197207
traceLog("NativeScriptRenderer.setValue");
198208
}
199209

200-
createElement(name: any, _namespace: string): NgView {
201-
traceLog(`NativeScriptRenderer.createElement: ${name}`);
202-
return this.viewUtil.createView(name);
203-
}
204-
205-
createText(_value: string) {
206-
traceLog("NativeScriptRenderer.createText");
207-
return this.viewUtil.createText();
208-
}
209-
210210
listen(renderElement: any, eventName: string, callback: (event: any) => boolean):
211211
() => void {
212212
traceLog("NativeScriptRenderer.listen: " + eventName);

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

+30-23
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ export class ViewUtil {
5353
}
5454

5555
public insertChild(parent: any, child: NgView, atIndex: number = -1) {
56-
if (!parent || child.meta.skipAddToDom || isPlaceholder(child) === true) {
56+
if (!parent || child.meta.skipAddToDom) {
5757
return;
5858
}
5959

@@ -120,8 +120,24 @@ export class ViewUtil {
120120
}
121121
}
122122

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

126142
if (!isKnownView(name)) {
127143
name = "ProxyViewContainer";
@@ -134,14 +150,6 @@ export class ViewUtil {
134150
return view;
135151
}
136152

137-
public createText(): NgView {
138-
const text = <NgView>new Placeholder();
139-
text.nodeName = "#text";
140-
text.visibility = "collapse";
141-
text.meta = getViewMeta("Placeholder");
142-
return text;
143-
}
144-
145153
private isXMLAttribute(name: string): boolean {
146154
return XML_ATTRIBUTES.indexOf(name) !== -1;
147155
}
@@ -201,23 +209,22 @@ export class ViewUtil {
201209
// returns -1 if the node has no parent or next sibling
202210
public nextSiblingIndex(node: NgView): number {
203211
const parent = node.parent;
204-
205212
if (!parent) {
206213
return -1;
207-
} else {
208-
let index = 0;
209-
let found = false;
210-
parent.eachChild(child => {
211-
if (child === node) {
212-
found = true;
213-
}
214+
}
215+
216+
let index = 0;
217+
let found = false;
218+
parent.eachChild(child => {
219+
if (child === node) {
220+
found = true;
221+
}
214222

215-
index += 1;
216-
return !found;
217-
});
223+
index += 1;
224+
return !found;
225+
});
218226

219-
return found ? index : -1;
220-
}
227+
return found ? index : -1;
221228
}
222229

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

0 commit comments

Comments
 (0)