@@ -2,12 +2,56 @@ part of angular.core.dom_internal;
2
2
3
3
var ngViewTag = new UserTag ('NgView' );
4
4
5
+ class NodeLinkingInfo {
6
+ /**
7
+ * True if the Node has a 'ng-binding' class.
8
+ */
9
+ final bool containsNgBinding;
10
+
11
+ /**
12
+ * True if the Node is a [dom.Element] , otherwise it is a Text or Comment node.
13
+ * No other nodeTypes are allowed.
14
+ */
15
+ final bool isElement;
16
+
17
+ /**
18
+ * If true, some child has a 'ng-binding' class and the ViewFactory must search
19
+ * for these children.
20
+ */
21
+ final bool ngBindingChildren;
22
+
23
+ NodeLinkingInfo (this .containsNgBinding, this .isElement, this .ngBindingChildren);
24
+ }
25
+
26
+ computeNodeLinkingInfos (List <dom.Node > nodeList) {
27
+ List <NodeLinkingInfo > list = new List <NodeLinkingInfo >(nodeList.length);
28
+
29
+ for (int i = 0 ; i < nodeList.length; i++ ) {
30
+ dom.Node node = nodeList[i];
31
+
32
+ assert (node.nodeType == dom.Node .ELEMENT_NODE ||
33
+ node.nodeType == dom.Node .TEXT_NODE ||
34
+ node.nodeType == dom.Node .COMMENT_NODE );
35
+
36
+ bool isElement = node.nodeType == dom.Node .ELEMENT_NODE ;
37
+
38
+ list[i] = new NodeLinkingInfo (
39
+ isElement && (node as dom.Element ).classes.contains ('ng-binding' ),
40
+ isElement,
41
+ isElement && (node as dom.Element ).querySelectorAll ('.ng-binding' ).length > 0 );
42
+ }
43
+ return list;
44
+ }
45
+
5
46
class TaggingViewFactory implements ViewFactory {
6
47
final List <TaggedElementBinder > elementBinders;
7
48
final List <dom.Node > templateNodes;
49
+ final List <NodeLinkingInfo > nodeLinkingInfos;
8
50
final Profiler _perf;
9
51
10
- TaggingViewFactory (this .templateNodes, this .elementBinders, this ._perf);
52
+ TaggingViewFactory (templateNodes, this .elementBinders, this ._perf) :
53
+ nodeLinkingInfos = computeNodeLinkingInfos (templateNodes),
54
+ this .templateNodes = templateNodes;
11
55
12
56
BoundViewFactory bind (Injector injector) => new BoundViewFactory (this , injector);
13
57
@@ -55,7 +99,8 @@ class TaggingViewFactory implements ViewFactory {
55
99
56
100
var elementBinderIndex = 0 ;
57
101
for (int i = 0 ; i < nodeList.length; i++ ) {
58
- var node = nodeList[i];
102
+ dom.Node node = nodeList[i];
103
+ NodeLinkingInfo linkingInfo = nodeLinkingInfos[i];
59
104
60
105
// if node isn't attached to the DOM, create a parent for it.
61
106
var parentNode = node.parentNode;
@@ -66,29 +111,27 @@ class TaggingViewFactory implements ViewFactory {
66
111
parentNode.append (node);
67
112
}
68
113
69
- if (node.nodeType == dom.Node .ELEMENT_NODE ) {
70
- var elts = node.querySelectorAll ('.ng-binding' );
71
- // querySelectorAll doesn't return the node itself
72
- if (node.classes.contains ('ng-binding' )) {
114
+ if (linkingInfo.isElement) {
115
+ if (linkingInfo.containsNgBinding) {
73
116
var tagged = elementBinders[elementBinderIndex];
74
117
_bindTagged (tagged, elementBinderIndex, rootInjector, elementInjectors, view, node);
75
118
elementBinderIndex++ ;
76
119
}
77
120
78
- for (int j = 0 ; j < elts.length; j++ , elementBinderIndex++ ) {
79
- TaggedElementBinder tagged = elementBinders[elementBinderIndex];
80
- _bindTagged (tagged, elementBinderIndex, rootInjector, elementInjectors, view, elts[j]);
121
+ if (linkingInfo.ngBindingChildren) {
122
+ var elts = (node as dom.Element ).querySelectorAll ('.ng-binding' );
123
+ for (int j = 0 ; j < elts.length; j++ , elementBinderIndex++ ) {
124
+ TaggedElementBinder tagged = elementBinders[elementBinderIndex];
125
+ _bindTagged (tagged, elementBinderIndex, rootInjector, elementInjectors, view, elts[j]);
126
+ }
81
127
}
82
- } else if (node.nodeType == dom.Node .TEXT_NODE ||
83
- node.nodeType == dom.Node .COMMENT_NODE ) {
128
+ } else {
84
129
TaggedElementBinder tagged = elementBinders[elementBinderIndex];
85
130
assert (tagged.binder != null || tagged.isTopLevel);
86
131
if (tagged.binder != null ) {
87
132
_bindTagged (tagged, elementBinderIndex, rootInjector, elementInjectors, view, node);
88
133
}
89
134
elementBinderIndex++ ;
90
- } else {
91
- throw "nodeType sadness ${node .nodeType }}" ;
92
135
}
93
136
94
137
if (fakeParent) {
0 commit comments