#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], это выдает ту же ошибку. Я знаю, что, вероятно, мои библиотеки вызывают проблему, но даже удаление и переустановка не изменили ее