mirror of
https://github.com/Hopiu/angular.js.git
synced 2026-03-17 07:40:22 +00:00
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:
parent
1dccaaaaa2
commit
cd9a7b9608
3 changed files with 34 additions and 3 deletions
10
src/apis.js
10
src/apis.js
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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']);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in a new issue