Skip to content

Commit 390aacd

Browse files
committed
fix(facade): workaround for lack of Symbol.iterator in es6-shim
Closes angular#4219 Fixes angular#4216
1 parent e166f6f commit 390aacd

File tree

4 files changed

+37
-6
lines changed

4 files changed

+37
-6
lines changed

modules/angular2/src/core/compiler/query_list.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import {ListWrapper, MapWrapper} from 'angular2/src/core/facade/collection';
2+
import {getSymbolIterator} from 'angular2/src/core/facade/lang';
3+
24

35
/**
46
* An iterable and observable live list of components in the DOM.
@@ -101,7 +103,7 @@ export class QueryList<T> {
101103

102104
map<U>(fn: (item: T) => U): U[] { return this._results.map(fn); }
103105

104-
[Symbol.iterator](): any { return this._results[Symbol.iterator](); }
106+
[getSymbolIterator()](): any { return this._results[getSymbolIterator()](); }
105107

106108
// Internal to the framework.
107109
fireCallbacks(): void {

modules/angular2/src/core/facade/collection.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1-
import {isJsObject, global, isPresent, isBlank, isArray} from 'angular2/src/core/facade/lang';
1+
import {
2+
isJsObject,
3+
global,
4+
isPresent,
5+
isBlank,
6+
isArray,
7+
getSymbolIterator
8+
} from 'angular2/src/core/facade/lang';
29

310
export var Map = global.Map;
411
export var Set = global.Set;
@@ -289,8 +296,8 @@ export class ListWrapper {
289296
export function isListLikeIterable(obj: any): boolean {
290297
if (!isJsObject(obj)) return false;
291298
return isArray(obj) ||
292-
(!(obj instanceof Map) && // JS Map are iterables but return entries as [k, v]
293-
Symbol.iterator in obj); // JS Iterable have a Symbol.iterator prop
299+
(!(obj instanceof Map) && // JS Map are iterables but return entries as [k, v]
300+
getSymbolIterator() in obj); // JS Iterable have a Symbol.iterator prop
294301
}
295302

296303
export function iterateListLike(obj: any, fn: Function) {
@@ -299,7 +306,7 @@ export function iterateListLike(obj: any, fn: Function) {
299306
fn(obj[i]);
300307
}
301308
} else {
302-
var iterator = obj[Symbol.iterator]();
309+
var iterator = obj[getSymbolIterator()]();
303310
var item;
304311
while (!((item = iterator.next()).done)) {
305312
fn(item.value);

modules/angular2/src/core/facade/lang.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,3 +351,24 @@ export function setValueOnPath(global: any, path: string, value: any) {
351351
}
352352
obj[parts.shift()] = value;
353353
}
354+
355+
// When Symbol.iterator doesn't exist, retrieves the key used in es6-shim
356+
var _symbolIterator = null;
357+
export function getSymbolIterator(): string | symbol {
358+
if (isBlank(_symbolIterator)) {
359+
if (isPresent(Symbol) && isPresent(Symbol.iterator)) {
360+
_symbolIterator = Symbol.iterator;
361+
} else {
362+
// es6-shim specific logic
363+
var keys = Object.getOwnPropertyNames(Map.prototype);
364+
for (var i = 0; i < keys.length; ++i) {
365+
var key = keys[i];
366+
if (key !== 'entries' && key !== 'size' &&
367+
Map.prototype[key] === Map.prototype['entries']) {
368+
_symbolIterator = key;
369+
}
370+
}
371+
}
372+
}
373+
return _symbolIterator;
374+
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1+
import {getSymbolIterator} from 'angular2/src/core/facade/lang';
12

23
export class TestIterable {
34
list: number[];
45
constructor() { this.list = []; }
56

6-
[Symbol.iterator]() { return this.list[Symbol.iterator](); }
7+
[getSymbolIterator()]() { return this.list[getSymbolIterator()](); }
78
}

0 commit comments

Comments
 (0)