@@ -11,48 +11,85 @@ class TaggingCompiler implements Compiler {
11
11
12
12
NodeCursor domCursor, NodeCursor templateCursor,
13
13
ElementBinder useExistingElementBinder,
14
- DirectiveMap directives) {
14
+ DirectiveMap directives,
15
+ int parentElementBinderOffset,
16
+ TaggedElementBinder directParentElementBinder) {
15
17
List <TaggedElementBinder > elementBinders = [];
16
- if (domCursor.nodeList ().length == 0 ) return null ;
18
+ if (domCursor.current == null ) return null ;
17
19
18
20
19
21
do {
20
- var subtrees, binder ;
22
+ var node = domCursor.current ;
21
23
22
- var node = domCursor. nodeList ()[ 0 ] ;
24
+ ElementBinder elementBinder ;
23
25
24
- // If nodetype is a element, call selector matchElement. If text, call selector.matchText
26
+ if (node.nodeType == 1 ) {
25
27
26
- // TODO: selector will return null for non-useful bindings.
27
- ElementBinder elementBinder = useExistingElementBinder == null
28
- ? directives.selector.match (node)
29
- : useExistingElementBinder;
28
+ // If nodetype is a element, call selector matchElement. If text, call selector.matchText
30
29
31
- if (elementBinder.hasTemplate) {
32
- elementBinder.templateViewFactory = _compileTransclusion (elementBinders,
33
- domCursor, templateCursor,
34
- elementBinder.template, elementBinder.templateBinder, directives);
30
+ // TODO: selector will return null for non-useful bindings.
31
+ elementBinder = useExistingElementBinder == null
32
+ ? directives.selector.matchElement (node)
33
+ : useExistingElementBinder;
34
+
35
+ if (elementBinder.hasTemplate) {
36
+ elementBinder.templateViewFactory = _compileTransclusion (elementBinders,
37
+ domCursor, templateCursor,
38
+ elementBinder.template, elementBinder.templateBinder, directives, parentElementBinderOffset);
39
+ }
35
40
}
36
41
37
- if (elementBinder.shouldCompileChildren) {
38
- if (domCursor.descend ()) {
39
- templateCursor.descend ();
42
+ node = domCursor.current;
43
+ if (node.nodeType == 1 ) {
40
44
41
- elementBinders.addAll (
42
- _compileView (domCursor, templateCursor, null , directives /*current element list length*/ ));
45
+ var taggedElementBinder = null ;
46
+ if (elementBinder.hasDirectives || elementBinder.hasTemplate) {
47
+ taggedElementBinder = new TaggedElementBinder (elementBinder, parentElementBinderOffset);
48
+ elementBinders.add (taggedElementBinder);
49
+ parentElementBinderOffset = elementBinders.length - 1 ;
43
50
44
- domCursor.ascend ();
45
- templateCursor.ascend ();
51
+ // TODO(deboer): Hack, this sucks.
52
+ (templateCursor.current as dom.Element ).classes.add ('ng-binding' );
53
+ node.classes.add ('ng-binding' );
46
54
}
47
- }
48
55
49
- // move this up
50
- if (elementBinder.hasDirectives) {
51
- elementBinders.add (new TaggedElementBinder (elementBinder, - 1 ));
52
- node.classes.add ('ng-binding' );
53
- binder = elementBinder;
56
+ if (elementBinder.shouldCompileChildren) {
57
+ if (domCursor.descend ()) {
58
+ templateCursor.descend ();
59
+
60
+ elementBinders.addAll (
61
+ _compileView (domCursor, templateCursor, null , directives, parentElementBinderOffset,
62
+ taggedElementBinder));
63
+
64
+ domCursor.ascend ();
65
+ templateCursor.ascend ();
66
+ }
67
+ }
68
+ } else if (node.nodeType == 3 || node.nodeType == 8 ) {
69
+ elementBinder = node.nodeType == 3 ? directives.selector.matchText (node) : elementBinder;
70
+
71
+ if (elementBinder.hasDirectives && (node.parentNode != null && templateCursor.current.parentNode != null )) {
72
+ if (directParentElementBinder == null ) {
73
+
74
+ directParentElementBinder = new TaggedElementBinder (null , parentElementBinderOffset);
75
+ elementBinders.add (directParentElementBinder);
76
+
77
+ assert (templateCursor.current.parentNode is dom.Element );
78
+ assert (node.parentNode is dom.Element );
79
+
80
+ (node.parentNode as dom.Element ).classes.add ('ng-binding' );
81
+ (templateCursor.current.parentNode as dom.Element ).classes.add ('ng-binding' );
82
+ }
83
+ directParentElementBinder.addText (new TaggedTextBinder (elementBinder, 0 /* TODO */ ));
84
+ } else if (! (node.parentNode != null && templateCursor.current.parentNode != null )) { // Always add an elementBinder for top-level text.
85
+ elementBinders.add (new TaggedElementBinder (elementBinder, parentElementBinderOffset));
86
+ }
87
+ // } else if (node.nodeType == 8) { // comment
88
+
89
+ } else {
90
+ throw "wtf" ;
54
91
}
55
- } while (templateCursor.microNext () && domCursor.microNext ());
92
+ } while (templateCursor.moveNext () && domCursor.moveNext ());
56
93
57
94
return elementBinders;
58
95
}
@@ -61,28 +98,28 @@ class TaggingCompiler implements Compiler {
61
98
NodeCursor domCursor, NodeCursor templateCursor,
62
99
DirectiveRef directiveRef,
63
100
ElementBinder transcludedElementBinder,
64
- DirectiveMap directives) {
101
+ DirectiveMap directives,
102
+ int parentElementBinderOffset) {
65
103
var anchorName = directiveRef.annotation.selector + (directiveRef.value != null ? '=' + directiveRef.value : '' );
66
104
var viewFactory;
67
105
var views;
68
106
69
107
var transcludeCursor = templateCursor.replaceWithAnchor (anchorName);
70
108
var domCursorIndex = domCursor.index;
71
109
var elementBinders =
72
- _compileView (domCursor, transcludeCursor, transcludedElementBinder, directives);
110
+ _compileView (domCursor, transcludeCursor, transcludedElementBinder, directives, parentElementBinderOffset, null );
73
111
if (elementBinders == null ) elementBinders = [];
74
112
75
113
viewFactory = new TaggingViewFactory (transcludeCursor.elements, elementBinders, _perf, _expando);
76
114
domCursor.index = domCursorIndex;
77
115
78
- if (domCursor.isInstance () ) {
116
+ if (domCursor.isInstance) {
79
117
domCursor.insertAnchorBefore (anchorName);
80
- views = [viewFactory (domCursor.nodeList ())];
81
- domCursor.macroNext ();
82
- templateCursor.macroNext ();
83
- while (domCursor.isValid () && domCursor.isInstance ()) {
84
- views.add (viewFactory (domCursor.nodeList ()));
85
- domCursor.macroNext ();
118
+ views = [viewFactory ([domCursor.current])];
119
+ domCursor.moveNext ();
120
+ templateCursor.moveNext ();
121
+ while (domCursor.moveNext () && domCursor.isInstance) {
122
+ views.add (viewFactory ([domCursor.current]));
86
123
templateCursor.remove ();
87
124
}
88
125
} else {
@@ -99,7 +136,7 @@ class TaggingCompiler implements Compiler {
99
136
List <dom.Node > templateElements = cloneElements (domElements);
100
137
List <TaggedElementBinder > elementBinders = _compileView (
101
138
new NodeCursor (domElements), new NodeCursor (templateElements),
102
- null , directives);
139
+ null , directives, - 1 , null );
103
140
104
141
var viewFactory = new TaggingViewFactory (templateElements,
105
142
elementBinders == null ? [] : elementBinders, _perf, _expando);
0 commit comments