@@ -93,13 +93,23 @@ functions.findBindings = function(binding, exactMatch, using, rootSelector) {
93
93
* Returns an array of all the elements in one segment for ng-repeat-start.
94
94
*
95
95
* @param {string } repeater The text of the repeater, e.g. 'cat in cats'.
96
+ * @param {boolean } exact Whether the repeater needs to be matched exactly
96
97
* @param {number } index The row index.
97
98
* @param {Element } using The scope of the search.
98
99
*
99
100
* @return {Array.<Element> } The row of the repeater, or an array of elements
100
101
* in the first row in the case of ng-repeat-start.
101
102
*/
102
- functions . findRepeaterRows = function ( repeater , index , using ) {
103
+ functions . findRepeaterRows = function ( repeater , exact , index , using ) {
104
+ function repeaterMatch ( ngRepeat , repeater , exact ) {
105
+ if ( exact ) {
106
+ return ngRepeat . split ( ' track by ' ) [ 0 ] . split ( ' as ' ) [ 0 ] . split ( '|' ) [ 0 ] .
107
+ trim ( ) == repeater ;
108
+ } else {
109
+ return ngRepeat . indexOf ( repeater ) != - 1 ;
110
+ }
111
+ }
112
+
103
113
using = using || document ;
104
114
105
115
var prefixes = [ 'ng-' , 'ng_' , 'data-ng-' , 'x-ng-' , 'ng\\:' ] ;
@@ -109,7 +119,7 @@ functions.findBindings = function(binding, exactMatch, using, rootSelector) {
109
119
var repeatElems = using . querySelectorAll ( '[' + attr + ']' ) ;
110
120
attr = attr . replace ( / \\ / g, '' ) ;
111
121
for ( var i = 0 ; i < repeatElems . length ; ++ i ) {
112
- if ( repeatElems [ i ] . getAttribute ( attr ) . indexOf ( repeater ) != - 1 ) {
122
+ if ( repeaterMatch ( repeatElems [ i ] . getAttribute ( attr ) , repeater , exact ) ) {
113
123
rows . push ( repeatElems [ i ] ) ;
114
124
}
115
125
}
@@ -122,11 +132,11 @@ functions.findBindings = function(binding, exactMatch, using, rootSelector) {
122
132
var repeatElems = using . querySelectorAll ( '[' + attr + ']' ) ;
123
133
attr = attr . replace ( / \\ / g, '' ) ;
124
134
for ( var i = 0 ; i < repeatElems . length ; ++ i ) {
125
- if ( repeatElems [ i ] . getAttribute ( attr ) . indexOf ( repeater ) != - 1 ) {
135
+ if ( repeaterMatch ( repeatElems [ i ] . getAttribute ( attr ) , repeater , exact ) ) {
126
136
var elem = repeatElems [ i ] ;
127
137
var row = [ ] ;
128
138
while ( elem . nodeType != 8 ||
129
- elem . nodeValue . indexOf ( repeater ) == - 1 ) {
139
+ ! repeaterMatch ( elem . nodeValue , repeater , exact ) ) {
130
140
if ( elem . nodeType == 1 ) {
131
141
row . push ( elem ) ;
132
142
}
@@ -144,11 +154,21 @@ functions.findBindings = function(binding, exactMatch, using, rootSelector) {
144
154
* Find all rows of an ng-repeat.
145
155
*
146
156
* @param {string } repeater The text of the repeater, e.g. 'cat in cats'.
157
+ * @param {boolean } exact Whether the repeater needs to be matched exactly
147
158
* @param {Element } using The scope of the search.
148
159
*
149
160
* @return {Array.<Element> } All rows of the repeater.
150
161
*/
151
- functions . findAllRepeaterRows = function ( repeater , using ) {
162
+ functions . findAllRepeaterRows = function ( repeater , exact , using ) {
163
+ function repeaterMatch ( ngRepeat , repeater , exact ) {
164
+ if ( exact ) {
165
+ return ngRepeat . split ( ' track by ' ) [ 0 ] . split ( ' as ' ) [ 0 ] . split ( '|' ) [ 0 ] .
166
+ trim ( ) == repeater ;
167
+ } else {
168
+ return ngRepeat . indexOf ( repeater ) != - 1 ;
169
+ }
170
+ }
171
+
152
172
using = using || document ;
153
173
154
174
var rows = [ ] ;
@@ -158,7 +178,7 @@ functions.findBindings = function(binding, exactMatch, using, rootSelector) {
158
178
var repeatElems = using . querySelectorAll ( '[' + attr + ']' ) ;
159
179
attr = attr . replace ( / \\ / g, '' ) ;
160
180
for ( var i = 0 ; i < repeatElems . length ; ++ i ) {
161
- if ( repeatElems [ i ] . getAttribute ( attr ) . indexOf ( repeater ) != - 1 ) {
181
+ if ( repeaterMatch ( repeatElems [ i ] . getAttribute ( attr ) , repeater , exact ) ) {
162
182
rows . push ( repeatElems [ i ] ) ;
163
183
}
164
184
}
@@ -168,10 +188,10 @@ functions.findBindings = function(binding, exactMatch, using, rootSelector) {
168
188
var repeatElems = using . querySelectorAll ( '[' + attr + ']' ) ;
169
189
attr = attr . replace ( / \\ / g, '' ) ;
170
190
for ( var i = 0 ; i < repeatElems . length ; ++ i ) {
171
- if ( repeatElems [ i ] . getAttribute ( attr ) . indexOf ( repeater ) != - 1 ) {
191
+ if ( repeaterMatch ( repeatElems [ i ] . getAttribute ( attr ) , repeater , exact ) ) {
172
192
var elem = repeatElems [ i ] ;
173
193
while ( elem . nodeType != 8 ||
174
- elem . nodeValue . indexOf ( repeater ) == - 1 ) {
194
+ ! repeaterMatch ( elem . nodeValue , repeater , exact ) ) {
175
195
if ( elem . nodeType == 1 ) {
176
196
rows . push ( elem ) ;
177
197
}
@@ -187,14 +207,24 @@ functions.findBindings = function(binding, exactMatch, using, rootSelector) {
187
207
* Find an element within an ng-repeat by its row and column.
188
208
*
189
209
* @param {string } repeater The text of the repeater, e.g. 'cat in cats'.
210
+ * @param {boolean } exact Whether the repeater needs to be matched exactly
190
211
* @param {number } index The row index.
191
212
* @param {string } binding The column binding, e.g. '{{cat.name}}'.
192
213
* @param {Element } using The scope of the search.
193
214
* @param {string } rootSelector The selector to use for the root app element.
194
215
*
195
216
* @return {Array.<Element> } The element in an array.
196
217
*/
197
- functions . findRepeaterElement = function ( repeater , index , binding , using , rootSelector ) {
218
+ functions . findRepeaterElement = function ( repeater , exact , index , binding , using , rootSelector ) {
219
+ function repeaterMatch ( ngRepeat , repeater , exact ) {
220
+ if ( exact ) {
221
+ return ngRepeat . split ( ' track by ' ) [ 0 ] . split ( ' as ' ) [ 0 ] . split ( '|' ) [ 0 ] .
222
+ trim ( ) == repeater ;
223
+ } else {
224
+ return ngRepeat . indexOf ( repeater ) != - 1 ;
225
+ }
226
+ }
227
+
198
228
var matches = [ ] ;
199
229
var root = document . querySelector ( rootSelector || 'body' ) ;
200
230
using = using || document ;
@@ -206,7 +236,7 @@ functions.findRepeaterElement = function(repeater, index, binding, using, rootSe
206
236
var repeatElems = using . querySelectorAll ( '[' + attr + ']' ) ;
207
237
attr = attr . replace ( / \\ / g, '' ) ;
208
238
for ( var i = 0 ; i < repeatElems . length ; ++ i ) {
209
- if ( repeatElems [ i ] . getAttribute ( attr ) . indexOf ( repeater ) != - 1 ) {
239
+ if ( repeaterMatch ( repeatElems [ i ] . getAttribute ( attr ) , repeater , exact ) ) {
210
240
rows . push ( repeatElems [ i ] ) ;
211
241
}
212
242
}
@@ -219,11 +249,11 @@ functions.findRepeaterElement = function(repeater, index, binding, using, rootSe
219
249
var repeatElems = using . querySelectorAll ( '[' + attr + ']' ) ;
220
250
attr = attr . replace ( / \\ / g, '' ) ;
221
251
for ( var i = 0 ; i < repeatElems . length ; ++ i ) {
222
- if ( repeatElems [ i ] . getAttribute ( attr ) . indexOf ( repeater ) != - 1 ) {
252
+ if ( repeaterMatch ( repeatElems [ i ] . getAttribute ( attr ) , repeater , exact ) ) {
223
253
var elem = repeatElems [ i ] ;
224
254
var row = [ ] ;
225
- while ( elem . nodeType != 8 ||
226
- ( elem . nodeValue && elem . nodeValue . indexOf ( repeater ) == - 1 ) ) {
255
+ while ( elem . nodeType != 8 || ( elem . nodeValue &&
256
+ ! repeaterMatch ( elem . nodeValue , repeater , exact ) ) ) {
227
257
if ( elem . nodeType == 1 ) {
228
258
row . push ( elem ) ;
229
259
}
@@ -285,13 +315,23 @@ functions.findRepeaterElement = function(repeater, index, binding, using, rootSe
285
315
* Find the elements in a column of an ng-repeat.
286
316
*
287
317
* @param {string } repeater The text of the repeater, e.g. 'cat in cats'.
318
+ * @param {boolean } exact Whether the repeater needs to be matched exactly
288
319
* @param {string } binding The column binding, e.g. '{{cat.name}}'.
289
320
* @param {Element } using The scope of the search.
290
321
* @param {string } rootSelector The selector to use for the root app element.
291
322
*
292
323
* @return {Array.<Element> } The elements in the column.
293
324
*/
294
- functions . findRepeaterColumn = function ( repeater , binding , using , rootSelector ) {
325
+ functions . findRepeaterColumn = function ( repeater , exact , binding , using , rootSelector ) {
326
+ function repeaterMatch ( ngRepeat , repeater , exact ) {
327
+ if ( exact ) {
328
+ return ngRepeat . split ( ' track by ' ) [ 0 ] . split ( ' as ' ) [ 0 ] . split ( '|' ) [ 0 ] .
329
+ trim ( ) == repeater ;
330
+ } else {
331
+ return ngRepeat . indexOf ( repeater ) != - 1 ;
332
+ }
333
+ }
334
+
295
335
var matches = [ ] ;
296
336
var root = document . querySelector ( rootSelector || 'body' ) ;
297
337
using = using || document ;
@@ -303,7 +343,7 @@ functions.findRepeaterColumn = function(repeater, binding, using, rootSelector)
303
343
var repeatElems = using . querySelectorAll ( '[' + attr + ']' ) ;
304
344
attr = attr . replace ( / \\ / g, '' ) ;
305
345
for ( var i = 0 ; i < repeatElems . length ; ++ i ) {
306
- if ( repeatElems [ i ] . getAttribute ( attr ) . indexOf ( repeater ) != - 1 ) {
346
+ if ( repeaterMatch ( repeatElems [ i ] . getAttribute ( attr ) , repeater , exact ) ) {
307
347
rows . push ( repeatElems [ i ] ) ;
308
348
}
309
349
}
@@ -316,11 +356,11 @@ functions.findRepeaterColumn = function(repeater, binding, using, rootSelector)
316
356
var repeatElems = using . querySelectorAll ( '[' + attr + ']' ) ;
317
357
attr = attr . replace ( / \\ / g, '' ) ;
318
358
for ( var i = 0 ; i < repeatElems . length ; ++ i ) {
319
- if ( repeatElems [ i ] . getAttribute ( attr ) . indexOf ( repeater ) != - 1 ) {
359
+ if ( repeaterMatch ( repeatElems [ i ] . getAttribute ( attr ) , repeater , exact ) ) {
320
360
var elem = repeatElems [ i ] ;
321
361
var row = [ ] ;
322
- while ( elem . nodeType != 8 ||
323
- ( elem . nodeValue && elem . nodeValue . indexOf ( repeater ) == - 1 ) ) {
362
+ while ( elem . nodeType != 8 || ( elem . nodeValue &&
363
+ ! repeaterMatch ( elem . nodeValue , repeater , exact ) ) ) {
324
364
if ( elem . nodeType == 1 ) {
325
365
row . push ( elem ) ;
326
366
}
0 commit comments