在ngFor中创建组件时,从不执行Angular ngOnInit

时间:2019-03-14 20:19:57

标签: angular angular-components angular-lifecycle-hooks

我遇到了一个谜。我在这个示例中处于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

1 个答案:

答案 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何时更改,但是您可以在可观察的订阅中执行此操作