0

我遇到了一个谜。我在这个例子中的 ngFor 循环中:

<div *ngFor="let rc of sortedKeys(ruleImplementations)">
    <vi-rule-contract [descriptor]="ruleDescriptors[rc]" [item]="action" [rc]="rc">
    </vi-rule-contract>
</div>

仅对于那些 N 个创建的“vi-rule-contract”组件中的一个(一个非常具体的组件),ngOnInit 不会仅被称为具有(描述符、rc、项目)的新值的 ngOnChanges。对于所有其他“vi-rule-contract”,ngOnInit 将被调用,但不会被调用 ngOnChanges。所以这是我的问题:

是否存在组件上的 ngOnInit 永远不会仅被称为 ngOnChanges 的情况?

PS角6.1.10

4

1 回答 1

0

问题是你有一个定义你的列表的函数,这意味着 ngFor 不断地重新执行,这是非常糟糕的做法,角度试图通过只实例化一次组件但更改输入来拯救你。

您的解决方法是停止在模板中使用函数,并在需要时运行它。

<div *ngFor="let rc of sortedRuleImplementations">
    <vi-rule-contract [descriptor]="ruleDescriptors[rc]" [item]="action" [rc]="rc">
    </vi-rule-contract>
</div>

this.sortedRuleImplementations = this.sortedKeys(ruleImplementations);

当 ruleImplementations 发生变化时,我无法从您的代码中看出这一点,但您可以在可观察订阅或其他方式中执行此操作

于 2019-03-14T20:26:23.417 回答