6
6
* found in the LICENSE file at https://angular.io/license
7
7
*/
8
8
import { assertDataInRange , assertEqual } from '../../util/assert' ;
9
- import { assertHasParent } from '../assert' ;
9
+ import { assertFirstCreatePass , assertHasParent } from '../assert' ;
10
10
import { attachPatchData } from '../context_discovery' ;
11
11
import { executeCheckHooks , executeInitAndCheckHooks , incrementInitPhaseFlags , registerPostOrderHooks } from '../hooks' ;
12
12
import { ACTIVE_INDEX , CONTAINER_HEADER_OFFSET , LContainer } from '../interfaces/container' ;
13
13
import { ComponentTemplate } from '../interfaces/definition' ;
14
14
import { LocalRefExtractor , TAttributes , TContainerNode , TNode , TNodeType , TViewNode } from '../interfaces/node' ;
15
15
import { isDirectiveHost } from '../interfaces/type_checks' ;
16
- import { FLAGS , HEADER_OFFSET , InitPhaseState , LView , LViewFlags , RENDERER , TVIEW , TViewType , T_HOST } from '../interfaces/view' ;
16
+ import { FLAGS , HEADER_OFFSET , InitPhaseState , LView , LViewFlags , RENDERER , TVIEW , TView , TViewType , T_HOST } from '../interfaces/view' ;
17
17
import { assertNodeType } from '../node_assert' ;
18
18
import { appendChild , removeView } from '../node_manipulation' ;
19
19
import { getBindingIndex , getCheckNoChangesMode , getIsParent , getLView , getPreviousOrParentTNode , setIsNotParent , setPreviousOrParentTNode } from '../state' ;
@@ -44,6 +44,36 @@ export function ɵɵcontainer(index: number): void {
44
44
setIsNotParent ( ) ;
45
45
}
46
46
47
+ function templateFirstCreatePass (
48
+ index : number , tView : TView , lView : LView , templateFn : ComponentTemplate < any > | null ,
49
+ decls : number , vars : number , tagName ?: string | null , attrsIndex ?: number | null ,
50
+ localRefsIndex ?: number | null ) : TContainerNode {
51
+ ngDevMode && assertFirstCreatePass ( tView ) ;
52
+ ngDevMode && ngDevMode . firstCreatePass ++ ;
53
+ const tViewConsts = tView . consts ;
54
+ // TODO(pk): refactor getOrCreateTNode to have the "create" only version
55
+ const tNode = getOrCreateTNode (
56
+ tView , lView [ T_HOST ] , index , TNodeType . Container , tagName || null ,
57
+ getConstant < TAttributes > ( tViewConsts , attrsIndex ) ) ;
58
+
59
+ resolveDirectives ( tView , lView , tNode , getConstant < string [ ] > ( tViewConsts , localRefsIndex ) ) ;
60
+ registerPostOrderHooks ( tView , tNode ) ;
61
+
62
+ const embeddedTView = tNode . tViews = createTView (
63
+ TViewType . Embedded , - 1 , templateFn , decls , vars , tView . directiveRegistry , tView . pipeRegistry ,
64
+ null , tView . schemas , tViewConsts ) ;
65
+ const embeddedTViewNode = createTNode ( tView , null , TNodeType . View , - 1 , null , null ) as TViewNode ;
66
+ embeddedTViewNode . injectorIndex = tNode . injectorIndex ;
67
+ embeddedTView . node = embeddedTViewNode ;
68
+
69
+ if ( tView . queries !== null ) {
70
+ tView . queries . template ( tView , tNode ) ;
71
+ embeddedTView . queries = tView . queries . embeddedTView ( tNode ) ;
72
+ }
73
+
74
+ return tNode ;
75
+ }
76
+
47
77
/**
48
78
* Creates an LContainer for an ng-template (dynamically-inserted view), e.g.
49
79
*
@@ -69,40 +99,27 @@ export function ɵɵtemplate(
69
99
localRefExtractor ?: LocalRefExtractor ) {
70
100
const lView = getLView ( ) ;
71
101
const tView = lView [ TVIEW ] ;
72
- const tViewConsts = tView . consts ;
102
+ const adjustedIndex = index + HEADER_OFFSET ;
73
103
74
- // TODO: consider a separate node type for templates
75
- const tContainerNode = containerInternal (
76
- lView , index , tagName || null , getConstant < TAttributes > ( tViewConsts , attrsIndex ) ) ;
77
-
78
- if ( tView . firstCreatePass ) {
79
- ngDevMode && ngDevMode . firstCreatePass ++ ;
80
- resolveDirectives (
81
- tView , lView , tContainerNode , getConstant < string [ ] > ( tViewConsts , localRefsIndex ) ) ;
82
- registerPostOrderHooks ( tView , tContainerNode ) ;
83
-
84
- const embeddedTView = tContainerNode . tViews = createTView (
85
- TViewType . Embedded , - 1 , templateFn , decls , vars , tView . directiveRegistry ,
86
- tView . pipeRegistry , null , tView . schemas , tViewConsts ) ;
87
- const embeddedTViewNode = createTNode ( tView , null , TNodeType . View , - 1 , null , null ) as TViewNode ;
88
- embeddedTViewNode . injectorIndex = tContainerNode . injectorIndex ;
89
- embeddedTView . node = embeddedTViewNode ;
90
-
91
- if ( tView . queries !== null ) {
92
- tView . queries . template ( tView , tContainerNode ) ;
93
- embeddedTView . queries = tView . queries . embeddedTView ( tContainerNode ) ;
94
- }
95
- }
104
+ const tNode = tView . firstCreatePass ?
105
+ templateFirstCreatePass (
106
+ index , tView , lView , templateFn , decls , vars , tagName , attrsIndex , localRefsIndex ) :
107
+ tView . data [ adjustedIndex ] as TContainerNode ;
108
+ setPreviousOrParentTNode ( tNode , false ) ;
96
109
97
- if ( isDirectiveHost ( tContainerNode ) ) {
98
- createDirectivesInstances ( tView , lView , tContainerNode ) ;
99
- }
110
+ const comment = lView [ RENDERER ] . createComment ( ngDevMode ? 'container' : '' ) ;
111
+ appendChild ( comment , tNode , lView ) ;
112
+ attachPatchData ( comment , lView ) ;
100
113
101
- if ( localRefsIndex !== null ) {
102
- saveResolvedLocalsInData ( lView , tContainerNode , localRefExtractor ) ;
114
+ addToViewTree ( lView , lView [ adjustedIndex ] = createLContainer ( comment , lView , comment , tNode ) ) ;
115
+
116
+ if ( isDirectiveHost ( tNode ) ) {
117
+ createDirectivesInstances ( tView , lView , tNode ) ;
103
118
}
104
119
105
- setIsNotParent ( ) ;
120
+ if ( localRefsIndex != null ) {
121
+ saveResolvedLocalsInData ( lView , tNode , localRefExtractor ) ;
122
+ }
106
123
}
107
124
108
125
/**
0 commit comments