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" ;
6
7
import { APP_ROOT_VIEW , DEVICE } from "./platform-providers" ;
7
8
import { isBlank } from "./lang-facade" ;
8
9
import { View } from "ui/core/view" ;
9
10
import { addCss } from "application" ;
10
11
import { topmost } from "ui/frame" ;
11
- import { Page } from "ui/page" ;
12
12
import { ViewUtil } from "./view-util" ;
13
13
import { NgView } from "./element-registry" ;
14
14
import { rendererLog as traceLog } from "./trace" ;
15
15
import { escapeRegexSymbols } from "utils/utils" ;
16
16
import { Device } from "platform" ;
17
17
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.
21
19
export const COMPONENT_VARIABLE = "%COMP%" ;
22
20
export const CONTENT_ATTR = `_ngcontent-${ COMPONENT_VARIABLE } ` ;
23
21
24
-
25
22
@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 ;
36
28
37
29
constructor (
38
- @Optional ( ) @Inject ( APP_ROOT_VIEW ) private _rootView : View ,
30
+ @Optional ( ) @Inject ( APP_ROOT_VIEW ) rootView : View ,
39
31
@Inject ( DEVICE ) device : Device ,
40
- private _zone : NgZone
32
+ zone : NgZone
41
33
) {
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 ) ;
43
37
}
44
38
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 ;
50
42
}
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 ;
56
45
}
57
46
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
+ }
61
51
62
- renderComponent ( componentProto : RenderComponentType ) : Renderer {
63
- let renderer = this . _registeredComponents . get ( componentProto . id ) ;
52
+ let renderer : NativeScriptRenderer = this . componentRenderers . get ( type . id ) ;
64
53
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 ) ;
68
65
}
69
- return renderer ;
66
+
67
+ return renderer ;
70
68
}
71
- }
72
69
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;
77
72
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 , "_" ) ) ;
80
77
}
78
+ }
81
79
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 ) ;
87
82
83
+ constructor (
84
+ private rootView : NgView ,
85
+ private zone : NgZone ,
86
+ private viewUtil : ViewUtil
87
+ ) {
88
88
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
- }
97
89
traceLog ( "NativeScriptRenderer created" ) ;
98
90
}
99
91
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
+ }
102
96
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
+ }
106
103
}
107
104
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 ) ;
110
108
}
111
109
112
110
selectRootElement ( selector : string ) : NgView {
113
111
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 } ` ) ;
117
121
}
118
122
119
123
createViewRoot ( hostElement : NgView ) : NgView {
@@ -128,55 +132,48 @@ export class NativeScriptRenderer extends Renderer {
128
132
} ) ;
129
133
}
130
134
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
+ }
135
140
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 } ` ) ;
140
143
}
141
144
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 ) ;
148
148
}
149
149
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 } ` ) ;
154
152
}
155
153
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 ) ;
160
157
}
161
158
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 ) ;
166
162
}
167
163
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
+ }
170
168
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 ) ;
176
172
}
177
173
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 ) ;
180
177
}
181
178
182
179
// Used only in debug mode to serialize property changes to comment nodes,
@@ -194,34 +191,32 @@ export class NativeScriptRenderer extends Renderer {
194
191
traceLog ( "NativeScriptRenderer.invokeElementMethod " + methodName + " " + args ) ;
195
192
}
196
193
197
- setText ( _renderNode : any , _text : string ) {
198
- traceLog ( "NativeScriptRenderer.setText " ) ;
194
+ setValue ( _renderNode : any , _value : string ) {
195
+ traceLog ( "NativeScriptRenderer.setValue " ) ;
199
196
}
200
197
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 } ` ) ;
205
200
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 ) ;
210
203
// Set an attribute to the view to scope component-specific css.
211
204
// 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
+ // }
216
210
} ) ;
217
211
}
218
212
219
- public createText ( _parentElement : NgView , _value : string ) : NgView {
213
+ createText ( _value : string ) : NgView {
220
214
traceLog ( "NativeScriptRenderer.createText" ) ;
221
215
return this . viewUtil . createText ( ) ;
222
216
}
223
217
224
- public listen ( renderElement : NgView , eventName : string , callback : Function ) : Function {
218
+ listen ( renderElement : any , eventName : string , callback : ( event : any ) => boolean ) :
219
+ ( ) => void {
225
220
traceLog ( "NativeScriptRenderer.listen: " + eventName ) ;
226
221
// Explicitly wrap in zone
227
222
let zonedCallback = ( ...args ) => {
@@ -237,21 +232,5 @@ export class NativeScriptRenderer extends Renderer {
237
232
}
238
233
return ( ) => renderElement . off ( eventName , zonedCallback ) ;
239
234
}
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
- }
257
235
}
236
+
0 commit comments