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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (118)

我遇到了一个谜。我在这个例子中的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将不会仅为其具有(descriptor,rc,item)的新值的ngOnChanges调用。对于所有其他'vi-rule-contract',将调用ngOnInit但从不ngOnChanges。所以这是我的问题:

有没有一种情况,组件上的ngOnInit永远不会只被调用它的ngOnChanges?

PS Angular 6.1.10

提问于
用户回答回答于

问题是你有一个定义你的列表的函数,这意味着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发生更改时,我无法从您的代码中判断出来,但您可以在可观察的订阅或其他内容中执行此操作

扫码关注云+社区

领取腾讯云代金券