1
1
part of angular.core.dom;
2
2
3
+ TaggedElementBinder _addBinder (List list, TaggedElementBinder binder) {
4
+ assert (binder.parentBinderOffset != list.length); // Do not point to yourself!
5
+ list.add (binder);
6
+ return binder;
7
+ }
8
+
3
9
@NgInjectableService ()
4
10
class TaggingCompiler implements Compiler {
5
11
final Profiler _perf;
@@ -13,11 +19,11 @@ class TaggingCompiler implements Compiler {
13
19
ElementBinder useExistingElementBinder,
14
20
DirectiveMap directives,
15
21
int parentElementBinderOffset,
16
- TaggedElementBinder directParentElementBinder) {
17
- List <TaggedElementBinder > elementBinders = [];
22
+ TaggedElementBinder directParentElementBinder,
23
+ List <TaggedElementBinder > elementBinders) {
24
+ assert (parentElementBinderOffset != null );
18
25
if (domCursor.current == null ) return null ;
19
26
20
-
21
27
do {
22
28
var node = domCursor.current;
23
29
@@ -43,10 +49,10 @@ class TaggingCompiler implements Compiler {
43
49
if (node.nodeType == 1 ) {
44
50
45
51
var taggedElementBinder = null ;
52
+ int taggedElementBinderIndex = parentElementBinderOffset;
46
53
if (elementBinder.hasDirectives || elementBinder.hasTemplate) {
47
- taggedElementBinder = new TaggedElementBinder (elementBinder, parentElementBinderOffset);
48
- elementBinders.add (taggedElementBinder);
49
- parentElementBinderOffset = elementBinders.length - 1 ;
54
+ taggedElementBinder = _addBinder (elementBinders, new TaggedElementBinder (elementBinder, parentElementBinderOffset));
55
+ taggedElementBinderIndex = elementBinders.length - 1 ;
50
56
51
57
// TODO(deboer): Hack, this sucks.
52
58
(templateCursor.current as dom.Element ).classes.add ('ng-binding' );
@@ -57,9 +63,8 @@ class TaggingCompiler implements Compiler {
57
63
if (domCursor.descend ()) {
58
64
templateCursor.descend ();
59
65
60
- elementBinders.addAll (
61
- _compileView (domCursor, templateCursor, null , directives, parentElementBinderOffset,
62
- taggedElementBinder));
66
+ _compileView (domCursor, templateCursor, null , directives, taggedElementBinderIndex,
67
+ taggedElementBinder, elementBinders);
63
68
64
69
domCursor.ascend ();
65
70
templateCursor.ascend ();
@@ -73,8 +78,7 @@ class TaggingCompiler implements Compiler {
73
78
(node.parentNode != null && templateCursor.current.parentNode != null )) {
74
79
if (directParentElementBinder == null ) {
75
80
76
- directParentElementBinder = new TaggedElementBinder (null , parentElementBinderOffset);
77
- elementBinders.add (directParentElementBinder);
81
+ directParentElementBinder = _addBinder (elementBinders, new TaggedElementBinder (null , parentElementBinderOffset));
78
82
79
83
assert (templateCursor.current.parentNode is dom.Element );
80
84
assert (node.parentNode is dom.Element );
@@ -84,7 +88,7 @@ class TaggingCompiler implements Compiler {
84
88
}
85
89
directParentElementBinder.addText (new TaggedTextBinder (elementBinder, 0 /* TODO */ ));
86
90
} else if (! (node.parentNode != null && templateCursor.current.parentNode != null )) { // Always add an elementBinder for top-level text.
87
- elementBinders. add ( new TaggedElementBinder (elementBinder, parentElementBinderOffset));
91
+ _addBinder (elementBinders, new TaggedElementBinder (elementBinder, parentElementBinderOffset));
88
92
}
89
93
} else {
90
94
throw "Unsupported node type for $node : [${node .nodeType }]" ;
@@ -106,9 +110,8 @@ class TaggingCompiler implements Compiler {
106
110
107
111
var transcludeCursor = templateCursor.replaceWithAnchor (anchorName);
108
112
var domCursorIndex = domCursor.index;
109
- var elementBinders =
110
- _compileView (domCursor, transcludeCursor, transcludedElementBinder, directives, parentElementBinderOffset, null );
111
- if (elementBinders == null ) elementBinders = [];
113
+ var elementBinders = [];
114
+ _compileView (domCursor, transcludeCursor, transcludedElementBinder, directives, parentElementBinderOffset, null , elementBinders);
112
115
113
116
viewFactory = new TaggingViewFactory (transcludeCursor.elements, elementBinders, _perf, _expando);
114
117
domCursor.index = domCursorIndex;
@@ -134,12 +137,13 @@ class TaggingCompiler implements Compiler {
134
137
assert ((timerId = _perf.startTimer ('ng.compile' , _html (elements))) != false );
135
138
List <dom.Node > domElements = elements;
136
139
List <dom.Node > templateElements = cloneElements (domElements);
137
- List <TaggedElementBinder > elementBinders = _compileView (
140
+ List <TaggedElementBinder > elementBinders = [];
141
+ _compileView (
138
142
new NodeCursor (domElements), new NodeCursor (templateElements),
139
- null , directives, - 1 , null );
143
+ null , directives, - 1 , null , elementBinders );
140
144
141
- var viewFactory = new TaggingViewFactory (templateElements,
142
- elementBinders == null ? [] : elementBinders, _perf, _expando);
145
+ var viewFactory = new TaggingViewFactory (
146
+ templateElements, elementBinders, _perf, _expando);
143
147
144
148
assert (_perf.stopTimer (timerId) != false );
145
149
return viewFactory;
0 commit comments