From 3945f884c5777e629b57c9ab0e93b9d02b9840d0 Mon Sep 17 00:00:00 2001 From: Igor Minar Date: Mon, 24 Oct 2011 09:18:44 -0700 Subject: fix(ng:repeat) with array ignore properties not representing array elements Along the way I also changed the repeater impl to use for loop instead of for in loop. Iteration over objects is handled by creating an array of keys, which is sorted and this array then determines the order of iteration over an element. This makes repeating over objects deterministic and cross-browser compatible. --- test/widgetsSpec.js | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) (limited to 'test') diff --git a/test/widgetsSpec.js b/test/widgetsSpec.js index 4aa36428..b93d698d 100644 --- a/test/widgetsSpec.js +++ b/test/widgetsSpec.js @@ -254,7 +254,7 @@ describe("widget", function() { 'ng:bind="key + \':\' + val + $index + \'|\'">'); scope.items = {'misko':'m', 'shyam':'s', 'frodo':'f'}; scope.$digest(); - expect(element.text()).toEqual('misko:m0|shyam:s1|frodo:f2|'); + expect(element.text()).toEqual('frodo:f0|misko:m1|shyam:s2|'); }); it('should expose iterator position as $position when iterating over arrays', function() { @@ -282,7 +282,7 @@ describe("widget", function() { ''); scope.items = {'misko':'m', 'shyam':'s', 'doug':'d', 'frodo':'f'}; scope.$digest(); - expect(element.text()).toEqual('misko:m:first|shyam:s:middle|doug:d:middle|frodo:f:last|'); + expect(element.text()).toEqual('doug:d:first|frodo:f:middle|misko:m:middle|shyam:s:last|'); delete scope.items.doug; delete scope.items.frodo; @@ -312,6 +312,26 @@ describe("widget", function() { expect(element.text()).toEqual('a|b|Xc|d|X'); }); + it('should ignore non-array element properties when iterating over an array', function() { + var scope = compile('