1
1
import {
2
2
Inject , Injectable , Optional , NgZone ,
3
- Renderer , RootRenderer , RenderComponentType , AnimationPlayer ,
4
- ɵAnimationStyles , ɵAnimationKeyframe ,
3
+ RendererV2 , RendererFactoryV2 , RendererTypeV2 ,
4
+ // ViewEncapsulation
5
+ // ɵAnimationStyles, ɵAnimationKeyframe,
5
6
} 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
+
6
14
import { APP_ROOT_VIEW , DEVICE } from "./platform-providers" ;
7
15
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" ;
12
16
import { ViewUtil } from "./view-util" ;
13
17
import { NgView } from "./element-registry" ;
14
18
import { rendererLog as traceLog } from "./trace" ;
15
19
import { escapeRegexSymbols } from "tns-core-modules/utils/utils" ;
16
20
import { Device } from "tns-core-modules/platform" ;
17
21
import { getRootPage } from "./platform-providers" ;
18
22
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.
22
24
export const COMPONENT_VARIABLE = "%COMP%" ;
23
25
export const CONTENT_ATTR = `_ngcontent-${ COMPONENT_VARIABLE } ` ;
24
26
25
-
26
27
@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 ;
37
33
38
34
constructor (
39
- @Optional ( ) @Inject ( APP_ROOT_VIEW ) private _rootView : View ,
35
+ @Optional ( ) @Inject ( APP_ROOT_VIEW ) rootView : View ,
40
36
@Inject ( DEVICE ) device : Device ,
41
- private _zone : NgZone
37
+ zone : NgZone
42
38
) {
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 ) ;
44
42
}
45
43
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 ;
51
47
}
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 ;
57
50
}
58
51
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
+ }
62
56
63
- renderComponent ( componentProto : RenderComponentType ) : Renderer {
64
- let renderer = this . _registeredComponents . get ( componentProto . id ) ;
57
+ let renderer : NativeScriptRenderer = this . componentRenderers . get ( type . id ) ;
65
58
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 ) ;
69
70
}
70
- return renderer ;
71
+
72
+ return renderer ;
71
73
}
72
- }
73
74
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
+
78
78
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 , "_" ) ) ;
81
82
}
83
+ }
82
84
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 ) ;
88
87
88
+ constructor (
89
+ private rootView : NgView ,
90
+ private zone : NgZone ,
91
+ private viewUtil : ViewUtil
92
+ ) {
89
93
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
- }
98
94
traceLog ( "NativeScriptRenderer created" ) ;
99
95
}
100
96
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
+ }
103
101
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
+ }
107
108
}
108
109
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 ) ;
111
113
}
112
114
113
115
selectRootElement ( selector : string ) : NgView {
114
116
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 } ` ) ;
118
126
}
119
127
120
128
createViewRoot ( hostElement : NgView ) : NgView {
@@ -129,55 +137,48 @@ export class NativeScriptRenderer extends Renderer {
129
137
} ) ;
130
138
}
131
139
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
+ }
136
145
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 } ` ) ;
141
148
}
142
149
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 ) ;
149
153
}
150
154
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 } ` ) ;
155
157
}
156
158
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 ) ;
161
162
}
162
163
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 ) ;
167
167
}
168
168
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
+ }
171
173
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 ) ;
177
177
}
178
178
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 ) ;
181
182
}
182
183
183
184
// Used only in debug mode to serialize property changes to comment nodes,
@@ -195,34 +196,32 @@ export class NativeScriptRenderer extends Renderer {
195
196
traceLog ( "NativeScriptRenderer.invokeElementMethod " + methodName + " " + args ) ;
196
197
}
197
198
198
- setText ( _renderNode : any , _text : string ) {
199
- traceLog ( "NativeScriptRenderer.setText " ) ;
199
+ setValue ( _renderNode : any , _value : string ) {
200
+ traceLog ( "NativeScriptRenderer.setValue " ) ;
200
201
}
201
202
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 } ` ) ;
206
205
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 ) ;
211
208
// Set an attribute to the view to scope component-specific css.
212
209
// 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
+ // }
217
215
} ) ;
218
216
}
219
217
220
- public createText ( _parentElement : NgView , _value : string ) : NgView {
218
+ createText ( _value : string ) : NgView {
221
219
traceLog ( "NativeScriptRenderer.createText" ) ;
222
220
return this . viewUtil . createText ( ) ;
223
221
}
224
222
225
- public listen ( renderElement : NgView , eventName : string , callback : Function ) : Function {
223
+ listen ( renderElement : any , eventName : string , callback : ( event : any ) => boolean ) :
224
+ ( ) => void {
226
225
traceLog ( "NativeScriptRenderer.listen: " + eventName ) ;
227
226
// Explicitly wrap in zone
228
227
let zonedCallback = ( ...args ) => {
@@ -238,21 +237,5 @@ export class NativeScriptRenderer extends Renderer {
238
237
}
239
238
return ( ) => renderElement . off ( eventName , zonedCallback ) ;
240
239
}
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
- }
258
240
}
241
+
0 commit comments