11import {
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+
614import { APP_ROOT_VIEW , DEVICE } from "./platform-providers" ;
715import { 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" ;
1216import { ViewUtil } from "./view-util" ;
1317import { NgView } from "./element-registry" ;
1418import { rendererLog as traceLog } from "./trace" ;
1519import { escapeRegexSymbols } from "tns-core-modules/utils/utils" ;
1620import { Device } from "tns-core-modules/platform" ;
1721import { 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.
2224export const COMPONENT_VARIABLE = "%COMP%" ;
2325export 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