【问题标题】:Cannot read property 'id' of undefined on ngOnInit() Angular7无法读取 ngOnInit() Angular7 上未定义的属性“id”
【发布时间】:2019-08-31 11:51:09
【问题描述】:

我是角度的初学者。问题实际上出在 EmployeeComponent.ts 中,如果我在 ngOnInit() 中调用 this.resetForm(); 则对话框的控件会在页面加载期间显示......但在编辑期间,当它来自雇员列表时,service.formData 始终设置回 null 我不希望这种情况发生。我希望实现这两种功能。

如果我在ngOnInit()remove this.resetForm();,则会出现以下错误。 (但编辑工作正常)注意:service.formData 包含字段 id、description 和 active

控制台日志错误:EmployeeComponent_Host.ngfactory.js? [sm]:1 错误 TypeError:无法读取未定义的属性“id” 在 EmployeeComponent.push。

EmployeeComponent.ts

ngOnInit() {
  this.resetForm();
}


resetForm(form ? : NgForm) {

  if (form != null)
    form.resetForm();

  this.service.formData = {
    id: null,
    description: '',
    active: true,
  }
  console.log(this.service.formData.id);
}  

EmployeeListComponent.ts

onEdit(emp: Employee) {
  this.service.formData = Object.assign({}, emp);
  const dialogConfig = new MatDialogConfig();
  dialogConfig.disableClose = true;
  dialogConfig.autoFocus = true;
  dialogConfig.width = "50%";
  this.dialog.open(EmployeeComponent, dialogConfig);
}

Employee.component.html

<form #form="ngForm" autocomplete="off" >
  <mat-grid-list cols="2">
          <input type="hidden" name="id" #id="ngModel" [(ngModel)]="service.formData.id">       
        <mat-form-field>   
          <input name="description" matInput #description="ngModel" [(ngModel)]="service.formData.description" placeholder="Employee" required>  
   </mat-form-field>
 <mat-checkbox  matInput #active="ngModel" [(ngModel)]="service.formData.active" name="active">Active</mat-checkbox>         
  </mat-grid-list>
      <button mat-raised-button color="primary" type="submit" [disabled]="form.invalid" (click)="onSubmit(form)">Submit</button>
      <button mat-raised-button color="warn" style="margin-left: 6px;" (click)="onClear(form)">Clear</button>

</form>

【问题讨论】:

    标签: angular google-cloud-firestore angular7


    【解决方案1】:

    这里 EmployeeComponent 是您要打开的垫子对话框组件,因此您需要在 EmployeeComponent 的构造函数中使用下面的对话框向对话框提供数据

     constructor(
    @Inject(MAT_DIALOG_DATA) data)){}
    

    当您打开对话框进行编辑时,您需要设置数据

      onEdit(emp: Employee) {
          dialogConfig = new MatDialogConfig();
          dialogConfig.disableClose = true;
          dialogConfig.autoFocus = true;
          dialogConfig.width = "50%";
          // Provide your data here      
          dialogConfig.data = emp;
    
          this.dialog.open(EmployeeComponent, dialogConfig);
        }
    

    现在您可以通过名称“数据”属性在 EmployeeComponent 上使用这些数据

    并且只在 ngOninit 中使用重置形式

    ngOnInit() {
    if (form != null)
        form.resetForm();
    }
    

    完成保存后需要处理的其他事情,例如清除此数据

    【讨论】:

    • 构造函数(@Inject(MAT_DIALOG_DATA) 数据)){}。怎么做。它在 EmployeeComponent.ts 中给了我错误
    • 我不能和 service.formData 一起使用吗?
    • 你可以参考这个链接来更好地理解blog.angular-university.io/angular-material-dialog来解决你需要像这样导入的错误 import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material";您应该使用数据注入请不要使用服务,因为它会在打开对话框时与您的逻辑与重置表单冲突
    猜你喜欢
    • 2019-09-13
    • 2019-10-27
    • 1970-01-01
    • 2019-11-18
    • 2018-10-01
    • 2021-06-27
    • 2021-05-20
    • 2019-07-25
    • 1970-01-01
    相关资源
    最近更新 更多