2016-03-14 42 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,你可以很容易地看到迭代器调用。