[Angular 18]Ошибка: не удалось найти столбец с идентификатором «завершен»

Я пытаюсь прочитать книгу под названием «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 и todolist или интерфейсе

Naren Murali 28.07.2024 22:51

Извините, пропустил ваш комментарий. Добавляем последний класс модели данных.

Aurélien Plazzotta 29.07.2024 00:16
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
2
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Проблема, с которой вы столкнулись, заключается в том, что ваш объект TodoItem не имеет свойства с именем «готово».

То есть в вашем HTML-шаблоне вы явно указали, что третий столбец таблицы должен быть заполнен из свойства «готово». Ниже вы найдете фрагмент кода из вашего кода, который ищет свойство Done:

Итак, вы либо добавляете это свойство в класс/интерфейс TodoItem, либо удаляете упомянутый столбец из своего HTML-шаблона.

Действительно, в моей модели данных такого свойства не было. Я использовал complete как второе свойство класса TodoItem. Я отредактировал соответствующим образом, но это все еще не решило проблему. Я также отредактировал основное сообщение, чтобы отразить текущую ситуацию.

Aurélien Plazzotta 29.07.2024 00:02

Кажется, вам сейчас не хватает «задачи» свойства. согласно вашему HTML, вам нужно 3 свойства (id, задача и выполнено). Не могли бы вы подтвердить, что они все у вас есть?

Yazan Ati 29.07.2024 00:14

У меня нет свойства класса с именем id, но ошибка компилятора по-прежнему связана с «Не удалось найти столбец с идентификатором «завершен».

Aurélien Plazzotta 29.07.2024 00:19

В соответствии со следующей строкой в ​​вашем шаблоне вам следует добавить свойство с именем id, поскольку вы привязаны к нему в шаблоне HTML <ng-container matColumnDef = "id">

Yazan Ati 29.07.2024 07:12

Модель данных не нуждается в идентификаторе, поскольку она заполняется оценкой каждого элемента в источнике данных благодаря привязке атрибута в [dataSource] = "items". Besides, addin it will throw a bunch of errors related to Аргумент типа «строка» не может быть назначен параметру типа «число» и Expected 2-3 arguments, but got 1 при анализе моего компонент AppComponent.

Aurélien Plazzotta 30.07.2024 03:40
Ответ принят как подходящий

У вас синтаксическая ошибка, вместо 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>

Демо-версия Stackblitz

Молодец, что нашел такую ​​тонкость и спасибо. К сожалению, это не решило проблему, и ошибка Could not find column with id "complete" сохраняется!

Aurélien Plazzotta 30.07.2024 03:19

@AurélienPlazzotta, пожалуйста, повторите на stackblitz и поделитесь ответом

Naren Murali 30.07.2024 03:38

Менеджер пакетов Yarn выходит из строя после получения пакетов 869/869 из-за ошибки «слишком большой рекурсии» и, следовательно, не может выполнить команду запуска. :-/

Aurélien Plazzotta 30.07.2024 12:46

@AurélienPlazzotta скачайте stackblitz и запустите, у меня все работает нормально, извините

Naren Murali 30.07.2024 12:48

Сравнение ваших файлов с моими позволило мне понять, что я пропустил одну букву в атрибуте моего шаблона. ng-container matColumdef = "complete" вместо ng-container matColumndef = "complete" Вот почему «полный» идентификатор никогда не был определен и, следовательно, не мог быть найден. Спасибо за ваше время!

Aurélien Plazzotta 30.07.2024 13:07

Другие вопросы по теме