fix(ng:repeat): support repeating over array with null

typeof null == 'object', but it doesn't behave like an object
because its properties can't be dereferenced, so we need
to special-case it.

Closes #702
This commit is contained in:
Igor Minar 2012-01-05 23:03:45 -08:00
parent 1dccaaaaa2
commit cd9a7b9608
3 changed files with 34 additions and 3 deletions

View file

@ -14,16 +14,20 @@
* The resulting string key is in 'type:hashKey' format.
*/
function hashKey(obj) {
var objType = typeof obj;
var key = obj;
if (objType == 'object') {
var objType = typeof obj,
key;
if (objType == 'object' && obj !== null) {
if (typeof (key = obj.$$hashKey) == 'function') {
// must invoke on object to keep the right this
key = obj.$$hashKey();
} else if (key === undefined) {
key = obj.$$hashKey = nextUid();
}
} else {
key = obj;
}
return objType + ':' + key;
}

View file

@ -36,6 +36,25 @@ describe('api', function() {
expect(map.shift('key')).toEqual(undefined);
expect(map[hashKey('key')]).toEqual(undefined);
});
it('should support primitive and object keys', function() {
var obj1 = {},
obj2 = {};
var map = new HashQueueMap();
map.push(obj1, 'a1');
map.push(obj1, 'a2');
map.push(obj2, 'b');
map.push(1, 'c');
map.push(undefined, 'd');
map.push(null, 'e');
expect(map[hashKey(obj1)]).toEqual(['a1', 'a2']);
expect(map[hashKey(obj2)]).toEqual(['b']);
expect(map[hashKey(1)]).toEqual(['c']);
expect(map[hashKey(undefined)]).toEqual(['d']);
expect(map[hashKey(null)]).toEqual(['e']);
});
});
});

View file

@ -429,6 +429,14 @@ describe('widget', function() {
expect(element.text()).toBe('a|b|||c||d|');
}));
it('should iterate over all kinds of types', inject(function($rootScope, $compile) {
var element = $compile('<ul><li ng:repeat="item in array">{{item}}|</li></ul>')($rootScope);
$rootScope.array = ['a', 1, null, undefined, {}];
$rootScope.$digest();
expect(element.text()).toMatch(/a\|1\|\|\|\{\s*\}\|/);
}));
describe('stability', function() {
var a, b, c, d, lis, element;