@@ -53,23 +53,24 @@ clientSideScripts.findBindings = function() {
53
53
} ;
54
54
55
55
/**
56
- * Find an array of elements matching a row within an ng-repeat. Always returns
57
- * an array of only one element.
56
+ * Find an array of elements matching a row within an ng-repeat.
57
+ * Always returns an array of only one element for plain old ng-repeat.
58
+ * Returns an array of all the elements in one segment for ng-repeat-start.
58
59
*
59
60
* arguments[0] {Element} The scope of the search.
60
61
* arguments[1] {string} The text of the repeater, e.g. 'cat in cats'.
61
62
* arguments[2] {number} The row index.
62
63
*
63
- * @return {Array.<Element> } An array of a single element, the row of the
64
- * repeater .
64
+ * @return {Array.<Element> } The row of the repeater, or an array of elements
65
+ * in the first row in the case of ng-repeat-start .
65
66
*/
66
67
clientSideScripts . findRepeaterRows = function ( ) {
67
68
var using = arguments [ 0 ] || document ;
68
69
var repeater = arguments [ 1 ] ;
69
70
var index = arguments [ 2 ] ;
70
71
71
- var rows = [ ] ;
72
72
var prefixes = [ 'ng-' , 'ng_' , 'data-ng-' , 'x-ng-' , 'ng\\:' ] ;
73
+ var rows = [ ] ;
73
74
for ( var p = 0 ; p < prefixes . length ; ++ p ) {
74
75
var attr = prefixes [ p ] + 'repeat' ;
75
76
var repeatElems = using . querySelectorAll ( '[' + attr + ']' ) ;
@@ -80,7 +81,29 @@ clientSideScripts.findBindings = function() {
80
81
}
81
82
}
82
83
}
83
- return [ rows [ index ] ] ;
84
+ // multiRows is an array of arrays, where each inner array contains
85
+ // one row of elements.
86
+ var multiRows = [ ] ;
87
+ for ( var p = 0 ; p < prefixes . length ; ++ p ) {
88
+ var attr = prefixes [ p ] + 'repeat-start' ;
89
+ var repeatElems = using . querySelectorAll ( '[' + attr + ']' ) ;
90
+ attr = attr . replace ( / \\ / g, '' ) ;
91
+ for ( var i = 0 ; i < repeatElems . length ; ++ i ) {
92
+ if ( repeatElems [ i ] . getAttribute ( attr ) . indexOf ( repeater ) != - 1 ) {
93
+ var elem = repeatElems [ i ] ;
94
+ var row = [ ] ;
95
+ while ( elem . nodeType != 8 ||
96
+ elem . nodeValue . indexOf ( repeater ) == - 1 ) {
97
+ if ( elem . nodeType == 1 ) {
98
+ row . push ( elem ) ;
99
+ }
100
+ elem = elem . nextSibling ;
101
+ }
102
+ multiRows . push ( row ) ;
103
+ }
104
+ }
105
+ }
106
+ return [ rows [ index ] ] . concat ( multiRows [ index ] ) ;
84
107
} ;
85
108
86
109
/**
@@ -107,6 +130,22 @@ clientSideScripts.findBindings = function() {
107
130
}
108
131
}
109
132
}
133
+ for ( var p = 0 ; p < prefixes . length ; ++ p ) {
134
+ var attr = prefixes [ p ] + 'repeat-start' ;
135
+ var repeatElems = using . querySelectorAll ( '[' + attr + ']' ) ;
136
+ attr = attr . replace ( / \\ / g, '' ) ;
137
+ for ( var i = 0 ; i < repeatElems . length ; ++ i ) {
138
+ if ( repeatElems [ i ] . getAttribute ( attr ) . indexOf ( repeater ) != - 1 ) {
139
+ var elem = repeatElems [ i ] ;
140
+ var row = [ ] ;
141
+ while ( elem . nodeType != 8 ||
142
+ elem . nodeValue . indexOf ( repeater ) == - 1 ) {
143
+ rows . push ( elem ) ;
144
+ elem = elem . nextSibling ;
145
+ }
146
+ }
147
+ }
148
+ }
110
149
return rows ;
111
150
} ;
112
151
@@ -139,14 +178,51 @@ clientSideScripts.findRepeaterElement = function() {
139
178
}
140
179
}
141
180
}
181
+ // multiRows is an array of arrays, where each inner array contains
182
+ // one row of elements.
183
+ var multiRows = [ ] ;
184
+ for ( var p = 0 ; p < prefixes . length ; ++ p ) {
185
+ var attr = prefixes [ p ] + 'repeat-start' ;
186
+ var repeatElems = using . querySelectorAll ( '[' + attr + ']' ) ;
187
+ attr = attr . replace ( / \\ / g, '' ) ;
188
+ for ( var i = 0 ; i < repeatElems . length ; ++ i ) {
189
+ if ( repeatElems [ i ] . getAttribute ( attr ) . indexOf ( repeater ) != - 1 ) {
190
+ var elem = repeatElems [ i ] ;
191
+ var row = [ ] ;
192
+ while ( elem . nodeType != 8 ||
193
+ ( elem . nodeValue && elem . nodeValue . indexOf ( repeater ) == - 1 ) ) {
194
+ if ( elem . nodeType == 1 ) {
195
+ row . push ( elem ) ;
196
+ }
197
+ elem = elem . nextSibling ;
198
+ }
199
+ multiRows . push ( row ) ;
200
+ }
201
+ }
202
+ }
142
203
var row = rows [ index ] ;
204
+ var multiRow = multiRows [ index ] ;
143
205
var bindings = [ ] ;
144
- if ( row . className . indexOf ( 'ng-binding' ) != - 1 ) {
145
- bindings . push ( row ) ;
206
+ if ( row ) {
207
+ if ( row . className . indexOf ( 'ng-binding' ) != - 1 ) {
208
+ bindings . push ( row ) ;
209
+ }
210
+ var childBindings = row . getElementsByClassName ( 'ng-binding' ) ;
211
+ for ( var i = 0 ; i < childBindings . length ; ++ i ) {
212
+ bindings . push ( childBindings [ i ] ) ;
213
+ }
146
214
}
147
- var childBindings = row . getElementsByClassName ( 'ng-binding' ) ;
148
- for ( var i = 0 ; i < childBindings . length ; ++ i ) {
149
- bindings . push ( childBindings [ i ] ) ;
215
+ if ( multiRow ) {
216
+ for ( var i = 0 ; i < multiRow . length ; ++ i ) {
217
+ rowElem = multiRow [ i ] ;
218
+ if ( rowElem . className . indexOf ( 'ng-binding' ) != - 1 ) {
219
+ bindings . push ( rowElem ) ;
220
+ }
221
+ var childBindings = rowElem . getElementsByClassName ( 'ng-binding' ) ;
222
+ for ( var j = 0 ; j < childBindings . length ; ++ j ) {
223
+ bindings . push ( childBindings [ j ] ) ;
224
+ }
225
+ }
150
226
}
151
227
for ( var i = 0 ; i < bindings . length ; ++ i ) {
152
228
var dataBinding = angular . element ( bindings [ i ] ) . data ( '$binding' ) ;
@@ -187,22 +263,56 @@ clientSideScripts.findRepeaterColumn = function() {
187
263
}
188
264
}
189
265
}
266
+ // multiRows is an array of arrays, where each inner array contains
267
+ // one row of elements.
268
+ var multiRows = [ ] ;
269
+ for ( var p = 0 ; p < prefixes . length ; ++ p ) {
270
+ var attr = prefixes [ p ] + 'repeat-start' ;
271
+ var repeatElems = using . querySelectorAll ( '[' + attr + ']' ) ;
272
+ attr = attr . replace ( / \\ / g, '' ) ;
273
+ for ( var i = 0 ; i < repeatElems . length ; ++ i ) {
274
+ if ( repeatElems [ i ] . getAttribute ( attr ) . indexOf ( repeater ) != - 1 ) {
275
+ var elem = repeatElems [ i ] ;
276
+ var row = [ ] ;
277
+ while ( elem . nodeType != 8 ||
278
+ ( elem . nodeValue && elem . nodeValue . indexOf ( repeater ) == - 1 ) ) {
279
+ if ( elem . nodeType == 1 ) {
280
+ row . push ( elem ) ;
281
+ }
282
+ elem = elem . nextSibling ;
283
+ }
284
+ multiRows . push ( row ) ;
285
+ }
286
+ }
287
+ }
288
+ var bindings = [ ] ;
190
289
for ( var i = 0 ; i < rows . length ; ++ i ) {
191
- var bindings = [ ] ;
192
290
if ( rows [ i ] . className . indexOf ( 'ng-binding' ) != - 1 ) {
193
291
bindings . push ( rows [ i ] ) ;
194
292
}
195
293
var childBindings = rows [ i ] . getElementsByClassName ( 'ng-binding' ) ;
196
294
for ( var k = 0 ; k < childBindings . length ; ++ k ) {
197
295
bindings . push ( childBindings [ k ] ) ;
198
296
}
199
- for ( var j = 0 ; j < bindings . length ; ++ j ) {
200
- var dataBinding = angular . element ( bindings [ j ] ) . data ( '$binding' ) ;
201
- if ( dataBinding ) {
202
- var bindingName = dataBinding . exp || dataBinding [ 0 ] . exp || dataBinding ;
203
- if ( bindingName . indexOf ( binding ) != - 1 ) {
204
- matches . push ( bindings [ j ] ) ;
205
- }
297
+ }
298
+ for ( var i = 0 ; i < multiRows . length ; ++ i ) {
299
+ for ( var j = 0 ; j < multiRows [ i ] . length ; ++ j ) {
300
+ var elem = multiRows [ i ] [ j ] ;
301
+ if ( elem . className . indexOf ( 'ng-binding' ) != - 1 ) {
302
+ bindings . push ( elem ) ;
303
+ }
304
+ var childBindings = elem . getElementsByClassName ( 'ng-binding' ) ;
305
+ for ( var k = 0 ; k < childBindings . length ; ++ k ) {
306
+ bindings . push ( childBindings [ k ] ) ;
307
+ }
308
+ }
309
+ }
310
+ for ( var j = 0 ; j < bindings . length ; ++ j ) {
311
+ var dataBinding = angular . element ( bindings [ j ] ) . data ( '$binding' ) ;
312
+ if ( dataBinding ) {
313
+ var bindingName = dataBinding . exp || dataBinding [ 0 ] . exp || dataBinding ;
314
+ if ( bindingName . indexOf ( binding ) != - 1 ) {
315
+ matches . push ( bindings [ j ] ) ;
206
316
}
207
317
}
208
318
}
0 commit comments