Skip to content

Commit c2c56b3

Browse files
sis0k0hdeshev
authored andcommitted
feat(renderer): upgrade to Angular-rc.1
- Use RendererFactoryV2 instead of RootRenderer (NativeScriptRendererFactory) - Use RendererV2 for NativeScriptRenderer
1 parent 0275a72 commit c2c56b3

10 files changed

+179
-225
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

+123-140
Original file line numberDiff line numberDiff line change
@@ -1,120 +1,128 @@
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";
7+
8+
import { escapeRegexSymbols } from "tns-core-modules/utils/utils";
9+
import { Device } from "tns-core-modules/platform";
10+
import { View } from "ui/core/view";
11+
import { addCss } from "application";
12+
import { topmost } from "ui/frame";
13+
614
import { APP_ROOT_VIEW, DEVICE } from "./platform-providers";
715
import { isBlank } from "./lang-facade";
8-
import { View } from "tns-core-modules/ui/core/view";
9-
import { addCss } from "tns-core-modules/application";
10-
import { topmost } from "tns-core-modules/ui/frame";
11-
import { Page } from "tns-core-modules/ui/page";
1216
import { ViewUtil } from "./view-util";
1317
import { NgView } from "./element-registry";
1418
import { rendererLog as traceLog } from "./trace";
1519
import { escapeRegexSymbols } from "tns-core-modules/utils/utils";
1620
import { Device } from "tns-core-modules/platform";
1721
import { getRootPage } from "./platform-providers";
1822

19-
import { NativeScriptAnimationDriver } from "./animation-driver";
20-
21-
// CONTENT_ATTR not exported from dom_renderer - we need it for styles application.
23+
// CONTENT_ATTR not exported from NativeScript_renderer - we need it for styles application.
2224
export const COMPONENT_VARIABLE = "%COMP%";
2325
export const CONTENT_ATTR = `_ngcontent-${COMPONENT_VARIABLE}`;
2426

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

3834
constructor(
39-
@Optional() @Inject(APP_ROOT_VIEW) private _rootView: View,
35+
@Optional() @Inject(APP_ROOT_VIEW) rootView: View,
4036
@Inject(DEVICE) device: Device,
41-
private _zone: NgZone
37+
zone: NgZone
4238
) {
43-
this._viewUtil = new ViewUtil(device);
39+
this.viewUtil = new ViewUtil(device);
40+
this.setRootNgView(rootView);
41+
this.defaultRenderer = new NativeScriptRenderer(this.rootNgView, zone, this.viewUtil);
4442
}
4543

46-
private _registeredComponents = new Map<string, NativeScriptRenderer>();
47-
48-
public get rootView(): View {
49-
if (!this._rootView) {
50-
this._rootView = getRootPage() || topmost().currentPage;
44+
private setRootNgView(rootView: any) {
45+
if (!rootView) {
46+
rootView = getRootPage() || topmost().currentPage;
5147
}
52-
return this._rootView;
53-
}
54-
55-
public get page(): Page {
56-
return <Page>this.rootView.page;
48+
rootView.nodeName = "NONE";
49+
this.rootNgView = rootView;
5750
}
5851

59-
public get viewUtil(): ViewUtil {
60-
return this._viewUtil;
61-
}
52+
createRenderer(element: any, type: RendererTypeV2): NativeScriptRenderer {
53+
if (!element || !type) {
54+
return this.defaultRenderer;
55+
}
6256

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

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

79-
private get viewUtil(): ViewUtil {
80-
return this.rootRenderer.viewUtil;
79+
private replaceNgAttribute(input: string, componentId: string): string {
80+
return input.replace(this.attrReplacer,
81+
"_ng_content_" + componentId.replace(this.attrSanitizer, "_"));
8182
}
83+
}
8284

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

88+
constructor(
89+
private rootView: NgView,
90+
private zone: NgZone,
91+
private viewUtil: ViewUtil
92+
) {
8993
super();
90-
let stylesLength = this.componentProto.styles.length;
91-
this.componentProtoId = this.componentProto.id;
92-
for (let i = 0; i < stylesLength; i++) {
93-
this.hasComponentStyles = true;
94-
let cssString = this.componentProto.styles[i] + "";
95-
const realCSS = this.replaceNgAttribute(cssString, this.componentProtoId);
96-
addCss(realCSS);
97-
}
9894
traceLog("NativeScriptRenderer created");
9995
}
10096

101-
private attrReplacer = new RegExp(escapeRegexSymbols(CONTENT_ATTR), "g");
102-
private attrSanitizer = /-/g;
97+
appendChild(parent: any, newChild: any): void {
98+
traceLog(`NativeScriptRenderer.appendChild child: ${newChild} parent: ${parent}`);
99+
this.viewUtil.insertChild(parent, newChild);
100+
}
103101

104-
private replaceNgAttribute(input: string, componentId: string): string {
105-
return input.replace(this.attrReplacer,
106-
"_ng_content_" + componentId.replace(this.attrSanitizer, "_"));
102+
103+
insertBefore(parent: any, newChild: any, refChild: any): void {
104+
traceLog(`NativeScriptRenderer.insertBefore child: ${newChild} parent: ${parent}`);
105+
if (parent) {
106+
parent.insertBefore(newChild, refChild);
107+
}
107108
}
108109

109-
renderComponent(componentProto: RenderComponentType): Renderer {
110-
return this.rootRenderer.renderComponent(componentProto);
110+
removeChild(parent: any, oldChild: NgView): void {
111+
traceLog(`NativeScriptRenderer.removeChild child: ${oldChild} parent: ${parent}`);
112+
this.viewUtil.removeChild(parent, oldChild);
111113
}
112114

113115
selectRootElement(selector: string): NgView {
114116
traceLog("selectRootElement: " + selector);
115-
const rootView = <NgView><any>this.rootRenderer.rootView;
116-
rootView.nodeName = "ROOT";
117-
return rootView;
117+
return this.rootView;
118+
}
119+
120+
parentNode(node: NgView): NgView {
121+
return node.templateParent;
122+
}
123+
124+
nextSibling(_node: NgView): void {
125+
traceLog(`NativeScriptRenderer.nextSibling ${_node}`);
118126
}
119127

120128
createViewRoot(hostElement: NgView): NgView {
@@ -129,55 +137,48 @@ export class NativeScriptRenderer extends Renderer {
129137
});
130138
}
131139

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

137-
viewRootNodes.forEach((node, index) => {
138-
const childIndex = insertPosition + index + 1;
139-
this.viewUtil.insertChild(parent, node, childIndex);
140-
});
146+
createComment(_value: any) {
147+
traceLog(`NativeScriptRenderer.createComment ${_value}`);
141148
}
142149

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

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

157-
setElementProperty(renderElement: NgView, propertyName: string, propertyValue: any) {
158-
traceLog("NativeScriptRenderer.setElementProperty " + renderElement + ": " +
159-
propertyName + " = " + propertyValue);
160-
this.viewUtil.setProperty(renderElement, propertyName, propertyValue);
159+
setProperty(view: any, name: string, value: any) {
160+
traceLog(`NativeScriptRenderer.setProperty ${view} : ${name} = ${value}`);
161+
this.viewUtil.setProperty(view, name, value);
161162
}
162163

163-
setElementAttribute(renderElement: NgView, attributeName: string, attributeValue: string) {
164-
traceLog("NativeScriptRenderer.setElementAttribute " + renderElement + ": " +
165-
attributeName + " = " + attributeValue);
166-
return this.setElementProperty(renderElement, attributeName, attributeValue);
164+
addClass(view: NgView, name: string): void {
165+
traceLog(`NativeScriptRenderer.addClass ${name}`);
166+
this.viewUtil.addClass(view, name);
167167
}
168168

169-
setElementClass(renderElement: NgView, className: string, isAdd: boolean): void {
170-
traceLog("NativeScriptRenderer.setElementClass " + className + " - " + isAdd);
169+
removeClass(view: NgView, name: string): void {
170+
traceLog(`NativeScriptRenderer.removeClass ${name}`);
171+
this.viewUtil.removeClass(view, name);
172+
}
171173

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

179-
setElementStyle(renderElement: NgView, styleName: string, styleValue: string): void {
180-
this.viewUtil.setStyleProperty(renderElement, styleName, styleValue);
179+
removeStyle(view: NgView, styleName: string, _hasVendorPrefix?: boolean): void {
180+
traceLog("NativeScriptRenderer.removeStyle: ${styleName}");
181+
this.viewUtil.removeStyle(view, styleName);
181182
}
182183

183184
// Used only in debug mode to serialize property changes to comment nodes,
@@ -195,34 +196,32 @@ export class NativeScriptRenderer extends Renderer {
195196
traceLog("NativeScriptRenderer.invokeElementMethod " + methodName + " " + args);
196197
}
197198

198-
setText(_renderNode: any, _text: string) {
199-
traceLog("NativeScriptRenderer.setText");
199+
setValue(_renderNode: any, _value: string) {
200+
traceLog("NativeScriptRenderer.setValue");
200201
}
201202

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

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

220-
public createText(_parentElement: NgView, _value: string): NgView {
218+
createText(_value: string): NgView {
221219
traceLog("NativeScriptRenderer.createText");
222220
return this.viewUtil.createText();
223221
}
224222

225-
public listen(renderElement: NgView, eventName: string, callback: Function): Function {
223+
listen(renderElement: any, eventName: string, callback: (event: any) => boolean):
224+
() => void {
226225
traceLog("NativeScriptRenderer.listen: " + eventName);
227226
// Explicitly wrap in zone
228227
let zonedCallback = (...args) => {
@@ -238,21 +237,5 @@ export class NativeScriptRenderer extends Renderer {
238237
}
239238
return () => renderElement.off(eventName, zonedCallback);
240239
}
241-
242-
public listenGlobal(_target: string, _eventName: string, _callback: Function): Function {
243-
throw new Error("NativeScriptRenderer.listenGlobal() - Not implemented.");
244-
}
245-
246-
public animate(
247-
element: any,
248-
startingStyles: ɵAnimationStyles,
249-
keyframes: ɵAnimationKeyframe[],
250-
duration: number,
251-
delay: number,
252-
easing: string
253-
): AnimationPlayer {
254-
let player = this.animationDriver.animate(
255-
element, startingStyles, keyframes, duration, delay, easing);
256-
return player;
257-
}
258240
}
241+

0 commit comments

Comments
 (0)