@@ -227,8 +227,14 @@ var ngOptionsDirective = ['$compile', '$parse', function($compile, $parse) {
227
227
var valueFn = $parse ( match [ 2 ] ? match [ 1 ] : valueName ) ;
228
228
var selectAsFn = selectAs && $parse ( selectAs ) ;
229
229
var viewValueFn = selectAsFn || valueFn ;
230
- var trackByFn = trackBy ? $parse ( trackBy ) :
231
- function getHashOfValue ( value ) { return hashKey ( value ) ; } ;
230
+ var trackByFn = trackBy && $parse ( trackBy ) ;
231
+
232
+ // Get the value by which we are going to track the option
233
+ // if we have a trackFn then use that (passing scope and locals)
234
+ // otherwise just hash the given viewValue
235
+ var getTrackByValue = trackBy ?
236
+ function ( viewValue , locals ) { return trackByFn ( scope , locals ) ; } :
237
+ function getHashOfValue ( viewValue ) { return hashKey ( viewValue ) ; } ;
232
238
var displayFn = $parse ( match [ 2 ] || match [ 1 ] ) ;
233
239
var groupByFn = $parse ( match [ 3 ] || '' ) ;
234
240
var valuesFn = $parse ( match [ 7 ] ) ;
@@ -263,7 +269,7 @@ var ngOptionsDirective = ['$compile', '$parse', function($compile, $parse) {
263
269
Object . keys ( values ) . forEach ( function getWatchable ( key ) {
264
270
var locals = getLocals ( values [ key ] , key ) ;
265
271
var label = displayFn ( scope , locals ) ;
266
- var selectValue = viewValueFn ( scope , locals ) ;
272
+ var selectValue = getTrackByValue ( values [ key ] , locals ) ;
267
273
watchedArray . push ( selectValue ) ;
268
274
watchedArray . push ( label ) ;
269
275
} ) ;
@@ -288,7 +294,7 @@ var ngOptionsDirective = ['$compile', '$parse', function($compile, $parse) {
288
294
var value = optionValues [ key ] ;
289
295
var locals = getLocals ( value , key ) ;
290
296
var viewValue = viewValueFn ( scope , locals ) ;
291
- var selectValue = trackByFn ( viewValue , locals ) ;
297
+ var selectValue = getTrackByValue ( viewValue , locals ) ;
292
298
var label = displayFn ( scope , locals ) ;
293
299
var group = groupByFn ( scope , locals ) ;
294
300
var optionItem = new Option ( selectValue , viewValue , label , group ) ;
@@ -301,7 +307,7 @@ var ngOptionsDirective = ['$compile', '$parse', function($compile, $parse) {
301
307
items : optionItems ,
302
308
selectValueMap : selectValueMap ,
303
309
getOptionFromViewValue : function ( value ) {
304
- return selectValueMap [ trackByFn ( value , getLocals ( value ) ) ] ;
310
+ return selectValueMap [ getTrackByValue ( value , getLocals ( value ) ) ] ;
305
311
}
306
312
} ;
307
313
}
0 commit comments