@@ -227,8 +227,14 @@ var ngOptionsDirective = ['$compile', '$parse', function($compile, $parse) {
227227 var valueFn = $parse ( match [ 2 ] ? match [ 1 ] : valueName ) ;
228228 var selectAsFn = selectAs && $parse ( selectAs ) ;
229229 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 ) ; } ;
232238 var displayFn = $parse ( match [ 2 ] || match [ 1 ] ) ;
233239 var groupByFn = $parse ( match [ 3 ] || '' ) ;
234240 var valuesFn = $parse ( match [ 7 ] ) ;
@@ -263,7 +269,7 @@ var ngOptionsDirective = ['$compile', '$parse', function($compile, $parse) {
263269 Object . keys ( values ) . forEach ( function getWatchable ( key ) {
264270 var locals = getLocals ( values [ key ] , key ) ;
265271 var label = displayFn ( scope , locals ) ;
266- var selectValue = viewValueFn ( scope , locals ) ;
272+ var selectValue = getTrackByValue ( values [ key ] , locals ) ;
267273 watchedArray . push ( selectValue ) ;
268274 watchedArray . push ( label ) ;
269275 } ) ;
@@ -288,7 +294,7 @@ var ngOptionsDirective = ['$compile', '$parse', function($compile, $parse) {
288294 var value = optionValues [ key ] ;
289295 var locals = getLocals ( value , key ) ;
290296 var viewValue = viewValueFn ( scope , locals ) ;
291- var selectValue = trackByFn ( viewValue , locals ) ;
297+ var selectValue = getTrackByValue ( viewValue , locals ) ;
292298 var label = displayFn ( scope , locals ) ;
293299 var group = groupByFn ( scope , locals ) ;
294300 var optionItem = new Option ( selectValue , viewValue , label , group ) ;
@@ -301,7 +307,7 @@ var ngOptionsDirective = ['$compile', '$parse', function($compile, $parse) {
301307 items : optionItems ,
302308 selectValueMap : selectValueMap ,
303309 getOptionFromViewValue : function ( value ) {
304- return selectValueMap [ trackByFn ( value , getLocals ( value ) ) ] ;
310+ return selectValueMap [ getTrackByValue ( value , getLocals ( value ) ) ] ;
305311 }
306312 } ;
307313 }
0 commit comments