ngIf выдает ‘TypeError: не удается прочитать свойство ‘visit’ неопределенного’ при индексации в массив

#javascript #angular

#javascript #угловой

Вопрос:

У меня есть ngIf внутри ngFor, и я использую индекс, чтобы проверить, равен ли элемент в этом индексе массива определенному значению, но всякий раз, когда я пытаюсь что-либо проиндексировать, он выдает

 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@angularcompiler-clisrcngtsctypechecksrcexpression.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 не определен, поскольку он жестко запрограммирован?
пример грубого стекирования: https://stackblitz.com/edit/angular-ivy-xdk4jr?file=package.json
дайте мне знать, если требуются другие файлы.

Комментарии:

1. ваша ошибка гласит, что не удается прочитать свойство ‘visit’, но в вашем коде нет посещения

2. да, я также смущен, почему он говорит, что

3. это говорит что-то о AstTranslator.translate, возможно, вам следует проверить свою библиотеку… вы уверены, что ошибка находится в предоставленном вами файле?

4. Сможете ли вы запустить stackblitz для этого?

5. это работает на stackblitz, что странно. Я предполагаю, что это могут быть мои модули узла, но я не уверен, частью чего является AstTranslator и что делать

Ответ №1:

Я столкнулся с аналогичной проблемой, и эти шаги помогли:

  • Удалите свою node_modules папку
  • Выполнить npm cache clean --force
  • Выполнить npm install
  • Выполнить ng s

Комментарии:

1. спасибо, но у меня это не работает:(

Ответ №2:

у вас логическая проблема с вашим кодом.

ваш временный массив представляет собой фиксированный список из 7 элементов

задачи — это неизвестное количество элементов.

вы перебираете задачи и (по какой-то причине) получаете элемент индекса элемента задачи для сравнения. это означает, что если у вас более 7 задач, вы будете пытаться получить доступ к temp [7], который не определен.

было бы лучше, если бы вы настроили свои данные следующим образом:

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

а затем html:

 *ngFor= "let task of taskItems"

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

или, если вам не нравится это решение, добавьте это в html:

 *ngIf="temp amp;amp; temp.length > index amp;amp; temp[index]==='Complete'"
 

Комментарии:

1. Я фокусируюсь только на интерфейсе, а серверная часть обрабатывается кем-то другим. Я создал только фиктивные данные, следуя структуре, из которой они будут возвращены, когда все будет настроено. И оба массива имеют одинаковую длину.

2. ну, очевидно, что они не одинаковой длины. вы могли бы добавить этот код в html: *ngIf="temp amp;amp; temp.length > index amp;amp; temp[index]==='Complete'" . это должно исправить ошибку.

3. это не исправляет проблему, даже если я просто делаю temp[0], это выдает ту же ошибку. Я знаю, что, вероятно, мои библиотеки вызывают проблему, но даже удаление и переустановка не изменили ее