diff --git a/src/ng/directive/select.js b/src/ng/directive/select.js index 46d38717c37b..1c533c2fbc5c 100644 --- a/src/ng/directive/select.js +++ b/src/ng/directive/select.js @@ -414,7 +414,23 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) { ctrl.$render = render; - scope.$watchCollection(valuesFn, scheduleRendering); + if (trackFn) { + scope.$watchCollection(function() { + var locals = {}, + values = valuesFn(scope); + if (values) { + var trackers = new Array(values.length); + for (var i = 0, ii = values.length; i < ii; i++) { + trackers[i] = trackFn(scope, locals); + } + + return trackers; + } + }, scheduleRendering); + } else { + scope.$watchCollection(valuesFn, scheduleRendering); + } + scope.$watchCollection(function () { var locals = {}, values = valuesFn(scope); diff --git a/test/ng/directive/selectSpec.js b/test/ng/directive/selectSpec.js index fb423d516622..2acd08f647ac 100644 --- a/test/ng/directive/selectSpec.js +++ b/test/ng/directive/selectSpec.js @@ -1162,6 +1162,29 @@ describe('select', function() { expect(element.val()).toEqual('?'); expect(element.find('option').eq(0).attr('selected')).toEqual('selected'); }); + + it('should respect trackexpr when working with arrays of objects', function() { + var elementCount = 5; + + createSelect({ + 'ng-model':'selected', + 'ng-options':'v as v.label for v in makeValues() track by v.code' + }); + + scope.$apply(function() { + scope.makeValues = function() { + var values = []; + for (var i = 0; i < elementCount; i++) { + values.push({label: 'Value = ' + i, code: i}); + } + + return values; + }; + scope.selected = {label: 'Value = 1', code: 1}; + }); + + expect(element.find('option').length).toEqual(elementCount); + }); });