开发者问题收集

ngIf 在索引数组时给出“TypeError:无法读取未定义的属性‘visit’”

2021-12-06
342

我在 ngFor 中有一个 ngIf,我使用索引来检查数组中该索引处的项目是否等于某个值,但每当我尝试索引任何内容时,它都会给出

Module build failed (from ./node_modules/@ngtools/webpack/src/ivy/index.js):
TypeError: Cannot read property 'visit' of undefined 
at AstTranslator.translate (<projdirectory>/node_modules\@angular\compiler-cli\src\ngtsc\typecheck\src\expression.js:81:24)
progress.component.ts 
import { Component, OnInit } from '@angular/core';

@Component({
    selector: 'app-progress',
    templateUrl: './progress.component.html',
    styleUrls: ['./progress.component.scss']
})
export class ProgressComponent implements OnInit {
    temp = [
             "Complete",
            "NotAttempted",
            "NotAttempted",
            "NotAttempted",
            "NotAttempted",
            "NotAttempted",
            "NotAttempted" 
           ]
    tasks = [some array of same length]
    constructor() { }

    ngOnInit(): void {
    }

}
progress.component.html

<div class="container">
    <div class="wrapper">
      
        <table class = "items">
            <thead>
                <tr class = "header-row">
                    <th class = "title-header">Title</th>
                    <th class = "due-header">Due Date</th>
                    <th class = "status-header">Status</th>
                </tr>
            </thead>
            <tbody> 
                <tr *ngFor="let task of tasks; let index = index">
                    <td>{{ task.title }}</td>
                    <td>{{ task.dueDate}}</td>
                    <td>
                       <div class = "complete" *ngIf="temp[index]==='Complete'">Complete </div>
                    </td> 
                </tr>
            </tbody>
        </table>
    </div>
</div>

我不明白 temp 既然是硬编码的,为什么还未定义? 粗略的 stackblitz 示例: https://stackblitz.com/edit/angular-ivy-xdk4jr?file=package.json 如果需要其他文件,请告诉我。

2个回答

我遇到过类似的问题,这些步骤很有帮助:

  • 删除您的 node_modules 文件夹
  • 运行 npm cache clean --force
  • 运行 npm install
  • 运行 ng s
Deepak
2021-12-06

您的代码存在逻辑问题。

您的 temp 数组是包含 7 个项目的固定列表

tasks 是未知数量的项目。

您正在循环遍历任务并(出于某种原因)获取要比较的任务元素的索引项。这意味着如果您有超过 7 个任务,您将尝试访问未定义的 temp[7]。

如果您像这样设置数据,代码会更好:

var taskItems = [{task: task1, status: 'Complete;},
  //etc.
];

然后是 html:

*ngFor= "let task of taskItems"

*ngIf="task.status == 'Complete'"

或者如果您不喜欢该解决方案,请将其添加到 html:

*ngIf="temp && temp.length > index && temp[index]==='Complete'"
Rick
2021-12-06