2016-03-14 41 views
8

我一直在使用ImmutableJS和Angular 2一段時間,因爲它在變化檢測方面的性能優勢。請參閱here.ImmutableJS如何與Angular 2一起使用?

但是,我不太確定,爲什麼Immutable在默認情況下適用於Angular 2。當沒有顯式數組時,它如何知道如何遍歷這些值並顯示它們?每次訪問集合的值時,是否只需撥打toJS()?它實現了Angular 2自動調用的某種方法嗎?

如果是這樣,有沒有辦法來定義你自己的集合,也實現了這種方法?

一個例子:

Component({ 
    selector: 'list', 
    template: '<ul><li *ngFor="#item of items">{{ item.id }}</li></ul>', 
    directives: [CORE_DIRECTIVES] 
}) 
export class SiteComponent { 
    items: Immutable.List<Item>; 
} 

回答

5

我不是一個角的用戶,但我認爲這是很容易看到下面的情況:我認爲

ngFor="#item of items" 

轉化爲一些相當於for..of週期。這個構造可以用於遍歷數組,但也可以用於任何一般的迭代。 (是的,immutable.List正確實現迭代協議)

一些細資源:

迭代協議上SO:

Checking whether something is iterable

在深度可迭代協議:

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Iteration_protocols

最後:

如果你想成爲100%肯定,創建一個簡單的結構,它是可迭代的,但它既不Array也不Immutable.List,所以角度不知道如何遍歷它,但使用迭代協議(需要babel或新的node版):

'use strict' 
let obj = {} 
// obj is iterable with values 1, 2, 3 
obj[Symbol.iterator] = function() { 
    console.log('Yes, I am using the iterable protocol indeed') 
    return [1, 2, 3][Symbol.iterator]() 
} 
for (let i of obj) { 
    console.log(i) // prints 1, 2, 3 
} 

現在,如果你用這個結構,而不是immutable.List,你可以很容易地看到迭代器調用。