我使用 *ngFor指令和新的@for块进行了不同级别的关闭. 我有一个父组件,它使用for循环创建多个子组件:

        <app-active-problem class="panel" *ngFor="let activeProblem of summary.activeProblems" [activeProblem] = "activeProblem" (update)="updateActiveProblem($event);"></app-active-problem>
        <!--
        @for (activeProblem of summary.activeProblems; track $index) {
            <app-active-problem class="panel" [activeProblem] = "activeProblem" (update)="updateActiveProblem($event);"></app-active-problem>
        }-->
      </ng-container>

在子组件中,我接受[active Problem]输入作为ProblemGroup| NarrativeProblem类. 为了有效区分两者并渲染视图. 我创建两个实例变量

  problemGroup?: ProblemGroup;
  narrativeProblem?: NarrativeProblem;

  ngOnInit(): void {
    if (this.activeProblem instanceof ProblemGroup) {
      this.problemGroup = this.activeProblem as ProblemGroup;
    } else {
      this.narrativeProblem = this.activeProblem;
    }
  }

在同一个视图中,我有一个单击事件处理程序,可以切换问题组下的值(本质上是变异对象).

            <input
              clrCheckbox
              type="checkbox"
              [checked]="p.value"
              (change)="toggle($event, $index)"
            />

如果我在将activeProblem分配给problem Group时使用@for渲染子组件,那么它就会失go 它的引用,从而实际上创建了对象的副本. 因此,我在子组件中所做的任何Mutations 都不会反映在原始对象中.

如果我使用 *ngFor指令渲染了子组件,那么它会按预期工作,我对problemGroup所做的任何更改都会有效地指向activeProblem.

我希望我能弄清楚为什么会发生这种情况?

推荐答案

我想*ngFor中你以前没有使用过trackBy功能吧?在angular 17中,当您使用@for时,您必须设置track功能,该功能与旧angular版本中的trackBy功能相同.在您的代码中,我看到您将其设置为track $index,这意味着angular总是认为它仍然是同一个元素并且永远不会改变.要解决此问题,您应该将track函数更改为类似track activeProblem的函数.

例如:

 @for (activeProblem of summary.activeProblems; track activeProblem) {
      <app-active-problem class="panel" [activeProblem] = "activeProblem" (update)="updateActiveProblem($event);"></app-active-problem>
 }

Javascript相关问答推荐

为什么使用MAX_SAFE_INTEGER生成随机整数时数字分布不准确?

在JavaScript中检索一些文本

如何获取转换字节的所有8位?

对象和数字减法会抵消浏览器js中的数字

如何为我的astro页面中的相同组件自动创建不同的内容?

自定义高图中的x轴标签序列

函数返回与输入对象具有相同键的对象

WP Bootstrap NavWaker:下拉菜单一次打开所有下拉菜单

如何在Node.js中排除导出的JS文件

SPAN不会在点击时关闭模式,尽管它们可以发送日志(log)等

如果一个字符串前面有点、空格或无字符串,后面有空格、连字符或无字符串,则匹配正则表达式

AddEventListner,按键事件不工作

匹配一个或多个可选重复的特定模式

处理TypeScrip Vue组件未初始化的react 对象

将Auth0用户对象存储在nextjs类型脚本的Reaction上下文中

在ChartJS中使用spanGaps时,是否获取空值的坐标?

P5play SecurityError:无法从';窗口';读取命名属性';Add';:阻止具有源的帧访问跨源帧

如何将字符串拆分成单词并跟踪每个单词的索引(在原始字符串中)?

对不同目录中的Angular material 表列进行排序

material UI自动完成全宽