2016-07-29 55 views
2

我有一个对象的数组,具有属性nameage。该阵列的名称是person角度2视图不更新阵列更改

问题是当我更新作为数组的元素的属性:

this.person[0].name = "godfather";

原始阵列被更新,但组件视图保持原样。我发现问题是角度变化检测不考虑数组内的更新作为更改。所以,我想下面的语句(变化参考阵列):

this.person = this.person.slice(); 

我只是想知道,使用后声明一个很好的做法还是有一些更好的方法来解决上述问题?

回答

1

这取决于该slice()操作的成本。如果是小型阵列,它可能不会造成任何伤害,但如果是大型阵列,则可能会导致显着的性能问题。在这种情况下,使用可观察的方式主动通知接收方有关更改是更好的方法。

+1

什么是更好的解决方案? – mishap

+1

可观察或使用IterableDiffer https://github.com/angular/angular/blob/14ee75924b6ae770115f7f260d720efa8bfb576a/modules/%40angular/common/src/directives/ng_for.ts#L111,也许是其他人。取决于具体的用例。 –

0

您的方法是slice的未指定使用,可能适用于一些但不是全部JS实现。 我已经使用这个成功:

this.person = JSON.parse(JSON.stringify(this.person)); 
+0

在compairson这似乎相当昂贵。你有链接提供关于slice()'可能不起作用的更多信息吗? –

+1

JSON方法更昂贵,是的。但是,如果它只用于UI,而不是循环或其他时间关键的代码,我不会看到问题。根据规格切片需要至少一个参数。没有指定没有参数的调用。 – hholtij

+0

只是'切片(0)'会做,那么我猜测呢? –