Я пытаюсь прочитать книгу под названием «Pro Angular 16», и снова я застрял на главе 2 из-за следующей ошибки, выдаваемой компилятором TypeScript, встроенным в инструменты разработки Angular 18:
Error: Could not find column with id "complete".
Похожие вопросы и ответы позволили мне не решить проблему, поэтому я попытаю счастья здесь.
app.comComponent.ts
import { Component } from '@angular/core';
import { TodoList } from "./todoList";
import { TodoItem } from "./todoItem";
import { FormsModule } from '@angular/forms';
import { MatButtonModule } from '@angular/material/button';
import { MatToolbarModule } from '@angular/material/toolbar';
import { MatIconModule } from '@angular/material/icon';
import { MatBadgeModule } from '@angular/material/badge';
import { MatTableModule } from '@angular/material/table';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
@Component({
selector: 'app-root',
standalone: true,
imports: [
FormsModule,
MatButtonModule, MatToolbarModule, MatIconModule, MatBadgeModule,
MatTableModule, MatCheckboxModule, MatFormFieldModule, MatInputModule, MatSlideToggleModule ],
templateUrl: './app.component.html',
styleUrl: './app.component.css'
})
export class AppComponent {
title = 'todo';
private list = new TodoList('Aurèle', [
new TodoItem("Finish the UBC website", true),
new TodoItem('Write some unit tests'),
new TodoItem('Learn Angular'),
new TodoItem('Write a word document for the jury'),
new TodoItem('Buy INCOSE book related to SysML v2', true),
]);
get username(): string {
return this.list.user;
}
get itemCount(): number {
return this.list.items.filter(item => !item.complete).length;
}
get items(): readonly TodoItem[] {
return this.list.items;
}
}
app.comComponent.html
<div class = "tableContainer">
<table mat-table [dataSource] = "items" class = "mat-elevation-z3 fullWidth">
<ng-container matColumnDef = "id">
<th mat-header-cell *matHeaderCellDef>#</th>
<td mat-cell *matCellDef = "let i = index">{{ i + 1 }}</td>
</ng-container>
<ng-container matColumnDef = "task">
<th mat-header-cell *matHeaderCellDef>Task</th>
<td mat-cell *matCellDef = "let item">{{ item.task }}</td>
</ng-container>
<ng-container matColumDef = "complete">
<th mat-header-cell *matHeaderCellDef>Done</th>
<td mat-cell *matCellDef = "let item">{{ item.complete }}</th>
</ng-container>
<tr mat-header-row *matHeaderRowDef = "['id', 'task', 'complete']"></tr>
<tr mat-row *matRowDef = "let row; columns: ['id', 'task', 'complete'];"></tr>
</table>
</div>
todoItem.ts
export class TodoItem {
constructor(public task: string, public complete: boolean = false) {
}
}
todoList.ts
import { TodoItem } from "./todoItem";
export class TodoList {
constructor(public user: string, private todoItems: TodoItem[] = []) {
}
get items(): readonly TodoItem[] {
return this.todoItems;
}
addItem(task: string) {
this.todoItems.push(new TodoItem(task));
}
}
Столбец id
существует, поэтому я в растерянности и не имею возможности самостоятельно разрешить эту блокировку.
Извините, пропустил ваш комментарий. Добавляем последний класс модели данных.
Проблема, с которой вы столкнулись, заключается в том, что ваш объект TodoItem
не имеет свойства с именем «готово».
То есть в вашем HTML-шаблоне вы явно указали, что третий столбец таблицы должен быть заполнен из свойства «готово». Ниже вы найдете фрагмент кода из вашего кода, который ищет свойство Done:
Итак, вы либо добавляете это свойство в класс/интерфейс TodoItem
, либо удаляете упомянутый столбец из своего HTML-шаблона.
Действительно, в моей модели данных такого свойства не было. Я использовал complete
как второе свойство класса TodoItem
. Я отредактировал соответствующим образом, но это все еще не решило проблему. Я также отредактировал основное сообщение, чтобы отразить текущую ситуацию.
Кажется, вам сейчас не хватает «задачи» свойства. согласно вашему HTML, вам нужно 3 свойства (id, задача и выполнено). Не могли бы вы подтвердить, что они все у вас есть?
У меня нет свойства класса с именем id
, но ошибка компилятора по-прежнему связана с «Не удалось найти столбец с идентификатором «завершен».
В соответствии со следующей строкой в вашем шаблоне вам следует добавить свойство с именем id, поскольку вы привязаны к нему в шаблоне HTML <ng-container matColumnDef = "id">
Модель данных не нуждается в идентификаторе, поскольку она заполняется оценкой каждого элемента в источнике данных благодаря привязке атрибута в [dataSource] = "items". Besides, addin it will throw a bunch of errors related to
Аргумент типа «строка» не может быть назначен параметру типа «число» и Expected 2-3 arguments, but got 1
при анализе моего компонент AppComponent
.
У вас синтаксическая ошибка, вместо td
вы использовали th
, это и было основной причиной проблемы.
<ng-container matColumDef = "complete">
<th mat-header-cell *matHeaderCellDef>Done</th>
<th mat-cell *matCellDef = "let item">{{ item.complete }}</th>
</ng-container>
<ng-container matColumnDef = "complete">
<th mat-header-cell *matHeaderCellDef>Complete</th>
<td mat-cell *matCellDef = "let item">{{ item.complete }}</td>
</ng-container>
Молодец, что нашел такую тонкость и спасибо. К сожалению, это не решило проблему, и ошибка Could not find column with id "complete"
сохраняется!
@AurélienPlazzotta, пожалуйста, повторите на stackblitz и поделитесь ответом
Менеджер пакетов Yarn выходит из строя после получения пакетов 869/869 из-за ошибки «слишком большой рекурсии» и, следовательно, не может выполнить команду запуска. :-/
@AurélienPlazzotta скачайте stackblitz и запустите, у меня все работает нормально, извините
Сравнение ваших файлов с моими позволило мне понять, что я пропустил одну букву в атрибуте моего шаблона. ng-container matColumdef = "complete"
вместо ng-container matColumndef = "complete"
Вот почему «полный» идентификатор никогда не был определен и, следовательно, не мог быть найден. Спасибо за ваше время!
пожалуйста, поделитесь информацией о классе todoitem и todolist или интерфейсе