自定义元素上的 Angular 非常奇怪的错误

2024-03-18

我制作了一个自定义选择元素,但出现了一个奇怪的错误。

我在这里重现了这个错误:https://stackblitz.com/edit/angular-ff7i5j https://stackblitz.com/edit/angular-ff7i5j

new-address 组件是产生此错误的组件。我可以从选择组件中选择一个项目一次,之后它看起来就像这个函数OptionSelectedEvent from select.ts不再被称为。

我真的不知道为什么第一个示例工作得很好,而在新地址组件中却不起作用。

我希望有人能帮助我解决这个奇怪的问题。


这里发生的事情是,在 Angular 模板中使用 getter 可能会导致许多我们没有预料到的问题。

我正在谈论您代码中的这些吸气剂:

public get Judete(): any[] {
  return [{auto: "AB", nume: "Alba"}, {auto: "AR", nume: "Arad"}...];
}

Angular 检查模板绑定并在每个更改检测周期执行所有 getter。该模板获取新实例Judete数组,其中包含每次检查中每个项目的新实例。

现在让我们看看在哪里使用该数组。

*ngFor="let item of Judete"

内置角度ngForOf指令使用特殊算法来查找数组中的变化IterableDiffers。这种差异发现您的数组在每个更改检测周期中都是完全新的数组,这会导致重新渲染项目。这意味着每次更改检测运行时都会创建新的 SelectOptionComponent 项目,并且您会丢失 ContentChildren 的订阅

所以解决方案应该很简单:只需定义一次数组,而不是使用 getter:

Judete =  [{auto: "AB", nume: "Alba"}, {auto: "AR", nume: "Arad"}, ...];

叉式堆栈闪电战 https://stackblitz.com/edit/angular-azkxxs?file=src/app/app.component.ts

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义元素上的 Angular 非常奇怪的错误 的相关文章

随机推荐