Skip to content

Commit a3adcca

Browse files
committed
feat(renderer): upgrade to Angular-rc.1
- Use RendererFactoryV2 instead of RootRenderer (NativeScriptRendererFactory) - Use RendererV2 for NativeScriptRenderer
1 parent 6fa9b58 commit a3adcca

10 files changed

+188
-223
lines changed

Diff for: nativescript-angular/nativescript.module.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@ import "./polyfills/array";
66
import "./polyfills/console";
77

88
import { CommonModule } from "@angular/common";
9-
import { NativeScriptRootRenderer, NativeScriptRenderer } from "./renderer";
9+
import { NativeScriptRendererFactory } from "./renderer";
1010
import { DetachedLoader } from "./common/detached-loader";
1111
import { ModalDialogHost, ModalDialogService } from "./directives/dialogs";
1212
import {
1313
ApplicationModule,
1414
ErrorHandler,
15-
Renderer,
16-
RootRenderer,
15+
// RendererV2,
16+
RendererFactoryV2,
1717
NgModule, NO_ERRORS_SCHEMA,
1818
} from "@angular/core";
1919
import {
@@ -39,10 +39,10 @@ export function errorHandlerFactory() {
3939
defaultPageProvider,
4040
defaultDeviceProvider,
4141

42-
NativeScriptRootRenderer,
43-
{ provide: RootRenderer, useClass: NativeScriptRootRenderer },
44-
NativeScriptRenderer,
45-
{ provide: Renderer, useClass: NativeScriptRenderer },
42+
NativeScriptRendererFactory,
43+
{ provide: RendererFactoryV2, useClass: NativeScriptRendererFactory },
44+
// NativeScriptRenderer,
45+
// { provide: RendererV2, useClass: NativeScriptRenderer },
4646
ModalDialogService
4747
],
4848
entryComponents: [

Diff for: nativescript-angular/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
"scripts": {
1717
"tslint": "tslint --project tsconfig.json --config tslint.json",
1818
"postinstall": "node postinstall.js",
19-
"ngc": "ngc -p tsconfig.json",
2019
"tsc": "tsc -p tsconfig.json",
20+
"ngc": "ngc -p tsconfig.json",
2121
"prepublish": "npm run tsc && npm run ngc"
2222
},
2323
"bin": {

Diff for: nativescript-angular/renderer.ts

+116-137
Original file line numberDiff line numberDiff line change
@@ -1,119 +1,123 @@
11
import {
22
Inject, Injectable, Optional, NgZone,
3-
Renderer, RootRenderer, RenderComponentType, AnimationPlayer,
4-
ɵAnimationStyles, ɵAnimationKeyframe,
3+
RendererV2, RendererFactoryV2, RendererTypeV2,
4+
// ViewEncapsulation
5+
// ɵAnimationStyles, ɵAnimationKeyframe,
56
} from "@angular/core";
67
import { APP_ROOT_VIEW, DEVICE } from "./platform-providers";
78
import { isBlank } from "./lang-facade";
89
import { View } from "ui/core/view";
910
import { addCss } from "application";
1011
import { topmost } from "ui/frame";
11-
import { Page } from "ui/page";
1212
import { ViewUtil } from "./view-util";
1313
import { NgView } from "./element-registry";
1414
import { rendererLog as traceLog } from "./trace";
1515
import { escapeRegexSymbols } from "utils/utils";
1616
import { Device } from "platform";
1717

18-
import { NativeScriptAnimationDriver } from "./animation-driver";
19-
20-
// CONTENT_ATTR not exported from dom_renderer - we need it for styles application.
18+
// CONTENT_ATTR not exported from NativeScript_renderer - we need it for styles application.
2119
export const COMPONENT_VARIABLE = "%COMP%";
2220
export const CONTENT_ATTR = `_ngcontent-${COMPONENT_VARIABLE}`;
2321

24-
2522
@Injectable()
26-
export class NativeScriptRootRenderer implements RootRenderer {
27-
private _viewUtil: ViewUtil;
28-
private _animationDriver: NativeScriptAnimationDriver;
29-
30-
protected get animationDriver(): NativeScriptAnimationDriver {
31-
if (!this._animationDriver) {
32-
this._animationDriver = new NativeScriptAnimationDriver();
33-
}
34-
return this._animationDriver;
35-
}
23+
export class NativeScriptRendererFactory implements RendererFactoryV2 {
24+
private componentRenderers = new Map<string, NativeScriptRenderer>();
25+
private viewUtil: ViewUtil;
26+
private defaultRenderer: NativeScriptRenderer;
27+
private rootNgView: NgView;
3628

3729
constructor(
38-
@Optional() @Inject(APP_ROOT_VIEW) private _rootView: View,
30+
@Optional() @Inject(APP_ROOT_VIEW) rootView: View,
3931
@Inject(DEVICE) device: Device,
40-
private _zone: NgZone
32+
zone: NgZone
4133
) {
42-
this._viewUtil = new ViewUtil(device);
34+
this.viewUtil = new ViewUtil(device);
35+
this.setRootNgView(rootView);
36+
this.defaultRenderer = new NativeScriptRenderer(this.rootNgView, zone, this.viewUtil);
4337
}
4438

45-
private _registeredComponents = new Map<string, NativeScriptRenderer>();
46-
47-
public get rootView(): View {
48-
if (!this._rootView) {
49-
this._rootView = topmost().currentPage;
39+
private setRootNgView(rootView: any) {
40+
if (!rootView) {
41+
rootView = <NgView><any>topmost().currentPage;
5042
}
51-
return this._rootView;
52-
}
53-
54-
public get page(): Page {
55-
return <Page>this.rootView.page;
43+
rootView.nodeName = "NONE";
44+
this.rootNgView = rootView;
5645
}
5746

58-
public get viewUtil(): ViewUtil {
59-
return this._viewUtil;
60-
}
47+
createRenderer(element: any, type: RendererTypeV2): NativeScriptRenderer {
48+
if (!element || !type) {
49+
return this.defaultRenderer;
50+
}
6151

62-
renderComponent(componentProto: RenderComponentType): Renderer {
63-
let renderer = this._registeredComponents.get(componentProto.id);
52+
let renderer: NativeScriptRenderer = this.componentRenderers.get(type.id);
6453
if (isBlank(renderer)) {
65-
renderer = new NativeScriptRenderer(this, componentProto,
66-
this.animationDriver, this._zone);
67-
this._registeredComponents.set(componentProto.id, renderer);
54+
renderer = this.defaultRenderer;
55+
56+
let stylesLength = type.styles.length;
57+
for (let i = 0; i < stylesLength; i++) {
58+
console.log(type.styles[i]);
59+
// this.hasComponentStyles = true;
60+
let cssString = type.styles[i] + "";
61+
const realCSS = this.replaceNgAttribute(cssString, type.id);
62+
addCss(realCSS);
63+
}
64+
this.componentRenderers.set(type.id, renderer);
6865
}
69-
return renderer;
66+
67+
return renderer;
7068
}
71-
}
7269

73-
@Injectable()
74-
export class NativeScriptRenderer extends Renderer {
75-
private componentProtoId: string;
76-
private hasComponentStyles: boolean;
70+
private attrReplacer = new RegExp(escapeRegexSymbols(CONTENT_ATTR), "g");
71+
private attrSanitizer = /-/g;
7772

78-
private get viewUtil(): ViewUtil {
79-
return this.rootRenderer.viewUtil;
73+
74+
private replaceNgAttribute(input: string, componentId: string): string {
75+
return input.replace(this.attrReplacer,
76+
"_ng_content_" + componentId.replace(this.attrSanitizer, "_"));
8077
}
78+
}
8179

82-
constructor(
83-
private rootRenderer: NativeScriptRootRenderer,
84-
private componentProto: RenderComponentType,
85-
private animationDriver: NativeScriptAnimationDriver,
86-
private zone: NgZone) {
80+
export class NativeScriptRenderer extends RendererV2 {
81+
data: {[key: string]: any} = Object.create(null);
8782

83+
constructor(
84+
private rootView: NgView,
85+
private zone: NgZone,
86+
private viewUtil: ViewUtil
87+
) {
8888
super();
89-
let stylesLength = this.componentProto.styles.length;
90-
this.componentProtoId = this.componentProto.id;
91-
for (let i = 0; i < stylesLength; i++) {
92-
this.hasComponentStyles = true;
93-
let cssString = this.componentProto.styles[i] + "";
94-
const realCSS = this.replaceNgAttribute(cssString, this.componentProtoId);
95-
addCss(realCSS);
96-
}
9789
traceLog("NativeScriptRenderer created");
9890
}
9991

100-
private attrReplacer = new RegExp(escapeRegexSymbols(CONTENT_ATTR), "g");
101-
private attrSanitizer = /-/g;
92+
appendChild(parent: any, newChild: any): void {
93+
traceLog(`NativeScriptRenderer.appendChild child: ${newChild} parent: ${parent}`);
94+
this.viewUtil.insertChild(parent, newChild);
95+
}
10296

103-
private replaceNgAttribute(input: string, componentId: string): string {
104-
return input.replace(this.attrReplacer,
105-
"_ng_content_" + componentId.replace(this.attrSanitizer, "_"));
97+
98+
insertBefore(parent: any, newChild: any, refChild: any): void {
99+
traceLog(`NativeScriptRenderer.insertBefore child: ${newChild} parent: ${parent}`);
100+
if (parent) {
101+
parent.insertBefore(newChild, refChild);
102+
}
106103
}
107104

108-
renderComponent(componentProto: RenderComponentType): Renderer {
109-
return this.rootRenderer.renderComponent(componentProto);
105+
removeChild(parent: any, oldChild: NgView): void {
106+
traceLog(`NativeScriptRenderer.removeChild child: ${oldChild} parent: ${parent}`);
107+
this.viewUtil.removeChild(parent, oldChild);
110108
}
111109

112110
selectRootElement(selector: string): NgView {
113111
traceLog("selectRootElement: " + selector);
114-
const rootView = <NgView><any>this.rootRenderer.rootView;
115-
rootView.nodeName = "ROOT";
116-
return rootView;
112+
return this.rootView;
113+
}
114+
115+
parentNode(node: NgView): NgView {
116+
return node.templateParent;
117+
}
118+
119+
nextSibling(_node: NgView): void {
120+
traceLog(`NativeScriptRenderer.nextSibling ${_node}`);
117121
}
118122

119123
createViewRoot(hostElement: NgView): NgView {
@@ -128,55 +132,48 @@ export class NativeScriptRenderer extends Renderer {
128132
});
129133
}
130134

131-
attachViewAfter(anchorNode: NgView, viewRootNodes: NgView[]) {
132-
traceLog("NativeScriptRenderer.attachViewAfter: " + anchorNode.nodeName + " " + anchorNode);
133-
const parent = (<NgView>anchorNode.parent || anchorNode.templateParent);
134-
const insertPosition = this.viewUtil.getChildIndex(parent, anchorNode);
135+
destroy() {
136+
traceLog("NativeScriptRenderer.destroy");
137+
// Seems to be called on component dispose only (router outlet)
138+
// TODO: handle this when we resolve routing and navigation.
139+
}
135140

136-
viewRootNodes.forEach((node, index) => {
137-
const childIndex = insertPosition + index + 1;
138-
this.viewUtil.insertChild(parent, node, childIndex);
139-
});
141+
createComment(_value: any) {
142+
traceLog(`NativeScriptRenderer.createComment ${_value}`);
140143
}
141144

142-
detachView(viewRootNodes: NgView[]) {
143-
traceLog("NativeScriptRenderer.detachView");
144-
for (let i = 0; i < viewRootNodes.length; i++) {
145-
let node = viewRootNodes[i];
146-
this.viewUtil.removeChild(<NgView>node.parent, node);
147-
}
145+
setAttribute(view: NgView, name: string, value: string) {
146+
traceLog(`NativeScriptRenderer.setAttribute ${view} : ${name} = ${value}`);
147+
return this.setProperty(view, name, value);
148148
}
149149

150-
public destroyView(_hostElement: NgView, _viewAllNodes: NgView[]) {
151-
traceLog("NativeScriptRenderer.destroyView");
152-
// Seems to be called on component dispose only (router outlet)
153-
// TODO: handle this when we resolve routing and navigation.
150+
removeAttribute(_el: NgView, _name: string): void {
151+
traceLog(`NativeScriptRenderer.removeAttribute ${_el}: ${_name}`);
154152
}
155153

156-
setElementProperty(renderElement: NgView, propertyName: string, propertyValue: any) {
157-
traceLog("NativeScriptRenderer.setElementProperty " + renderElement + ": " +
158-
propertyName + " = " + propertyValue);
159-
this.viewUtil.setProperty(renderElement, propertyName, propertyValue);
154+
setProperty(view: any, name: string, value: any) {
155+
traceLog(`NativeScriptRenderer.setProperty ${view} : ${name} = ${value}`);
156+
this.viewUtil.setProperty(view, name, value);
160157
}
161158

162-
setElementAttribute(renderElement: NgView, attributeName: string, attributeValue: string) {
163-
traceLog("NativeScriptRenderer.setElementAttribute " + renderElement + ": " +
164-
attributeName + " = " + attributeValue);
165-
return this.setElementProperty(renderElement, attributeName, attributeValue);
159+
addClass(view: NgView, name: string): void {
160+
traceLog(`NativeScriptRenderer.addClass ${name}`);
161+
this.viewUtil.addClass(view, name);
166162
}
167163

168-
setElementClass(renderElement: NgView, className: string, isAdd: boolean): void {
169-
traceLog("NativeScriptRenderer.setElementClass " + className + " - " + isAdd);
164+
removeClass(view: NgView, name: string): void {
165+
traceLog(`NativeScriptRenderer.removeClass ${name}`);
166+
this.viewUtil.removeClass(view, name);
167+
}
170168

171-
if (isAdd) {
172-
this.viewUtil.addClass(renderElement, className);
173-
} else {
174-
this.viewUtil.removeClass(renderElement, className);
175-
}
169+
setStyle(view: NgView, styleName: string, value: any, _hasVendorPrefix?: boolean, _hasImportant?: boolean): void {
170+
traceLog(`NativeScriptRenderer.setStyle: ${styleName} = ${value}`);
171+
this.viewUtil.setStyle(view, styleName, value);
176172
}
177173

178-
setElementStyle(renderElement: NgView, styleName: string, styleValue: string): void {
179-
this.viewUtil.setStyleProperty(renderElement, styleName, styleValue);
174+
removeStyle(view: NgView, styleName: string, _hasVendorPrefix?: boolean): void {
175+
traceLog("NativeScriptRenderer.removeStyle: ${styleName}");
176+
this.viewUtil.removeStyle(view, styleName);
180177
}
181178

182179
// Used only in debug mode to serialize property changes to comment nodes,
@@ -194,34 +191,32 @@ export class NativeScriptRenderer extends Renderer {
194191
traceLog("NativeScriptRenderer.invokeElementMethod " + methodName + " " + args);
195192
}
196193

197-
setText(_renderNode: any, _text: string) {
198-
traceLog("NativeScriptRenderer.setText");
194+
setValue(_renderNode: any, _value: string) {
195+
traceLog("NativeScriptRenderer.setValue");
199196
}
200197

201-
public createTemplateAnchor(parentElement: NgView): NgView {
202-
traceLog("NativeScriptRenderer.createTemplateAnchor");
203-
return this.viewUtil.createTemplateAnchor(parentElement);
204-
}
198+
createElement(name: any, _namespace: string): NgView {
199+
traceLog(`NativeScriptRenderer.createElement: ${name}`);
205200

206-
public createElement(parentElement: NgView, name: string): NgView {
207-
traceLog("NativeScriptRenderer.createElement: " + name + " parent: " +
208-
parentElement + ", " + (parentElement ? parentElement.nodeName : "null"));
209-
return this.viewUtil.createView(name, parentElement, (view) => {
201+
return this.viewUtil.createView(name, view => {
202+
console.log(view);
210203
// Set an attribute to the view to scope component-specific css.
211204
// The property name is pre-generated by Angular.
212-
if (this.hasComponentStyles) {
213-
const cssAttribute = this.replaceNgAttribute(CONTENT_ATTR, this.componentProtoId);
214-
view[cssAttribute] = true;
215-
}
205+
206+
// if (this.hasComponentStyles) {
207+
// const cssAttribute = this.replaceNgAttribute(CONTENT_ATTR, this.componentProtoId);
208+
// view[cssAttribute] = true;
209+
// }
216210
});
217211
}
218212

219-
public createText(_parentElement: NgView, _value: string): NgView {
213+
createText(_value: string): NgView {
220214
traceLog("NativeScriptRenderer.createText");
221215
return this.viewUtil.createText();
222216
}
223217

224-
public listen(renderElement: NgView, eventName: string, callback: Function): Function {
218+
listen(renderElement: any, eventName: string, callback: (event: any) => boolean):
219+
() => void {
225220
traceLog("NativeScriptRenderer.listen: " + eventName);
226221
// Explicitly wrap in zone
227222
let zonedCallback = (...args) => {
@@ -237,21 +232,5 @@ export class NativeScriptRenderer extends Renderer {
237232
}
238233
return () => renderElement.off(eventName, zonedCallback);
239234
}
240-
241-
public listenGlobal(_target: string, _eventName: string, _callback: Function): Function {
242-
throw new Error("NativeScriptRenderer.listenGlobal() - Not implemented.");
243-
}
244-
245-
public animate(
246-
element: any,
247-
startingStyles: ɵAnimationStyles,
248-
keyframes: ɵAnimationKeyframe[],
249-
duration: number,
250-
delay: number,
251-
easing: string
252-
): AnimationPlayer {
253-
let player = this.animationDriver.animate(
254-
element, startingStyles, keyframes, duration, delay, easing);
255-
return player;
256-
}
257235
}
236+

0 commit comments

Comments
 (0)