diff --git a/src/ng/directive/ngRepeat.js b/src/ng/directive/ngRepeat.js index 8c934b767210..893ad442e1b4 100644 --- a/src/ng/directive/ngRepeat.js +++ b/src/ng/directive/ngRepeat.js @@ -119,14 +119,7 @@ var ngRepeatDirective = ngDirective({ key = (collection === array) ? index : array[index]; value = collection[key]; - // if value is object, it can be shifted to allow for position change - // if is not object, need to first check whether index is same to avoid shifting wrong val - last = isObject(value) - ? lastOrder.shift(value) - : (last = lastOrder.peek(value)) && (index === last.index) - ? lastOrder.shift(value) - : undefined; - + last = lastOrder.shift(value); if (last) { // if we have already seen this object, then we need to reuse the diff --git a/test/ng/directive/ngRepeatSpec.js b/test/ng/directive/ngRepeatSpec.js index 5442ff39e1d2..a45cd972c8b9 100644 --- a/test/ng/directive/ngRepeatSpec.js +++ b/test/ng/directive/ngRepeatSpec.js @@ -431,5 +431,23 @@ describe('ngRepeat', function() { expect(newElements[1]).toEqual(lis[1]); expect(newElements[2]).toEqual(lis[0]); }); + + + it('should reuse elements even when model is composed of primitives', function() { + // rebuilding repeater from scratch can be expensive, we should try to avoid it even for + // model that is composed of primitives. + + scope.items = ['hello', 'cau', 'ahoj']; + scope.$digest(); + lis = element.find('li'); + + scope.items = ['ahoj', 'hello', 'cau']; + scope.$digest(); + var newLis = element.find('li'); + expect(newLis.length).toEqual(3); + expect(newLis[0]).toEqual(lis[2]); + expect(newLis[1]).toEqual(lis[0]); + expect(newLis[2]).toEqual(lis[1]); + }); }); });