开发者问题收集

Angular:无法读取 AppComponent_Template 中未定义的属性(读取‘名称’)[关闭]

2023-09-11
285

我在 Angular 应用程序中遇到一个问题,我收到以下错误消息:

javascript 复制代码 错误 TypeError:无法读取未定义的属性(读取“name”) 此错误发生在我的 app.component.html 文件中,特别是在我尝试显示 editEmployee 对象的 name 属性的模板部分。以下是相关代码:

app.component.ts:

typescript
import { Component, OnInit } from '@angular/core';
import { Employee } from './employee';
import { EmployeeService } from './employee.service';
import { HttpErrorResponse } from '@angular/common/http';
import { NgForm } from '@angular/forms';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})

export class AppComponent implements OnInit {
  public employees: Employee[] = [];
  public editEmployee!: Employee; // Initialization is done in ngOnInit

  constructor(private employeeService: EmployeeService) {}

  ngOnInit(): void {
    console.log('Fetching employees...');
    this.getEmployees();
  }

  // Other methods for adding, updating, and deleting employees...

  public getEmployees(): void {
    this.employeeService.getEmployees().subscribe(
      (response: Employee[]) => {
        this.employees = response;
      },
      (error: HttpErrorResponse) => {
        alert(error.message);
      }
    );
  }

  // Other methods...

  public onOpenModal(mode: string, employee: Employee | null = null): void {
    // Modal opening logic...
  }
}
app.component.html:

html

<!-- This is where the error occurs -->
<h1>{{ editEmployee.name }}</h1>

我已通过调用 this.getEmployees() 确保 editEmployee 对象在 ngOnInit 方法中正确初始化。但是,当页面加载时,它仍然显示一张空卡,并且错误出现在控制台中。单击“更新”按钮即可正确加载所有数据。

我尝试了各种故障排除步骤,包括检查数据检索逻辑并确认数据已成功获取。我现在正在寻求有关可能导致此错误的原因以及如何解决该错误的指导。

对于解决此问题的任何帮助或见解都将不胜感激。谢谢!

检查 ngOnInit:我通过添加控制台日志和断点来验证 ngOnInit 方法是否正确调用 getEmployees 函数。

HTTP 请求日志记录:我在 getEmployees 函数中记录了来自 HTTP 请求的响应,以确保从服务器获取数据。

模板数据绑定:我通过添加调试输出来显示数据,确认模板已正确绑定到员工数组。

调试 editEmployee:我添加了控制台日志和调试信息来跟踪 editEmployee 对象以查看它是否已初始化。

editEmployee 的初始化:当页面加载时,我希望使用从获取的员工记录中的数据初始化 editEmployee 对象。

员工数据的显示:我希望员工数据能够正确显示在模板中,例如姓名、电子邮件、职位和电话号码。

无错误:我没想到在页面加载或与员工数据交互时。

2个回答

初始化是在 ngOnInit 中完成的...没问题,但不是在构造函数中,至少你需要设置:

public editEmployee: Employee | null = null

在 html 上使用类似这样的代码

<h1 *ngIf="editEmployee" >{{ editEmployee.name }}</h1>

不是最好的方法,但一定有效

仅供参考: 在你的 html 上你是否使用了“editEmployee”,并且这是未定义的,直到你选择要编辑的员工

Jarek C. Sour
2023-09-11

Initialization of editEmployee: When the page loads, I expected the editEmployee object to be initialized with data from the fetched employee records.

I've ensured that the editEmployee object is initialized correctly in the ngOnInit method by calling this.getEmployees().

不,你没有。你正在异步加载数据。你启动了请求并注册了要在数据到达时执行的回调。传递给 subscribe 的函数仅在数据到达后执行。

将其与 setTimeout 进行比较:传递给 setTimeout 的函数不会立即执行,而是在指定的持续时间后执行

ngOnInit(): void {
  console.log('Fetching employees...');
  setTimeout(() => {
    this.editEmployee = {name: 'John'}
  }, 500);
}

ngOnInit 完成后,组件被呈现,但您的响应尚未到达 - 因此 editEmployee 为 null。

请注意,在 ngOnInit 中初始化数据是完全合法的,但在您的情况下,初始化发生在 ngOnInit 之后。

要解决此问题,请使用 ngIf 有条件地呈现您的组件:

<h1 *ngIf="editEmployee">{{ editEmployee.name }}</h1>

一种常见的模式是在相反的情况下显示加载指示器(您拥有的旋转器)。

另一种选择可能是 ?. 运算符用于访问可选属性

<h1>{{ editEmployee?.name }}</h1>
Lesiak
2023-09-11