我遇到了一个谜。我在这个示例中处于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,item)调用其ngOnChanges。对于所有其他“ vi-rule-contract”,将调用ngOnInit,但不会调用ngOnChanges。所以这是我的问题:
是否存在一种情况,即组件上的ngOnInit永远不会仅被称为其ngOnChanges?
PS Angular 6.1.10
答案 0 :(得分:0)
问题是您有一个定义列表的函数,这意味着ngFor会不断重新执行,这是非常糟糕的做法,angular试图通过仅实例化一次组件但更改输入来节省您的时间。
您的解决方法是停止在模板中使用函数,而仅在需要时运行它。
<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何时更改,但是您可以在可观察的订阅中执行此操作