ImmutableJS如何与Angular 2一起使用?

时间:2016-03-14 15:03:20

标签: typescript angular immutable.js

我已经在Angular 2中使用了ImmutableJS一段时间了,因为它在变更检测中具有性能优势。见here.

但是,我不太确定,为什么Immutable默认使用Angular 2。当没有显式数组时,它如何知道如何迭代值并显示它们?每次访问集合的值时,它是否只调用var app = angular.module("demo", []); app.controller("demoController", function($scope) { $scope.vm = { project: { localCosts: [{ contributors: ["a", "b", "c"] }, { contributors: ["e", "f", "g"] }, { contributors: ["h", "i", "j"] }] } }; $scope.callback = function(newValue, oldValue, i, j) { console.log(i, j, oldValue, newValue); }; }); ?它是否实现了Angular 2自动调用的某种方法?

如果是这样,有没有办法定义自己的集合,并实现此方法?

一个例子:

toJS()

1 个答案:

答案 0 :(得分:5)

我不是Angular用户,但我认为很容易看到下面发生的事情:我假设

ngFor="#item of items"

转换为某个等效的for..of周期。此构造可用于迭代Arrays,但也可用于任何可迭代的。 (是的,immutable.List正确实现了可迭代协议)

一些优秀的资源:

SO上的可迭代协议:

Checking whether something is iterable

深度可迭代协议:

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

最后:

如果你想100%确定,创建一个可迭代的简单结构,但它既不是Array也不是Immutable.List,所以Angular不知道如何迭代它但是使用可迭代协议(需要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,则可以很容易地看到迭代器被调用。