angular - TypeError : Cannot read property 'taxTypeId' of undefined at Object. View_FullEditTaxComponent_0._co [as updateDirectives]

标签 angular typescript

我有一个详细信息表单,它应该在从列表表单中选择时加载记录的详细信息。当加载详细信息表单时,它应该显示所选记录的详细信息。在我的例子中,它显示的细节很好,但它在控制台上显示标题错误,导致应用程序崩溃。

HTML(错误行)

<select id="taxTypeId" name="TaxTypeId" [(ngModel)]="tax.taxTypeId" class="form-control" >
   <option *ngFor="let tt of taxTypes" value={{tt.id}}>{{tt.name}}</option>
</select>
<label for="taxTypeId" class="form-label">Tax Type</label>

typescript

import { Component, ViewChild, Injector, Output, EventEmitter, ElementRef, OnInit } from '@angular/core';
import { RouterLink, Router, ActivatedRoute } from '@angular/router';
import { TaxServiceProxy, TaxDto, ListResultDtoOfTaxTypeDto } from '../../../shared/service-proxies/tax-service-proxies';
import { TaxTypeDto } from '../../../shared/service-proxies/taxType-service-proxies';
import { AppComponentBase } from '@shared/app-component-base';

@Component({
  selector: 'app-full-edit-tax',
  templateUrl: './full-edit-tax.component.html',
  styleUrls: ['./full-edit-tax.component.css']
})
export class FullEditTaxComponent extends AppComponentBase implements OnInit {
  active: boolean = false;
  saving: boolean = false;
  tax: TaxDto;
  taxTypes: TaxTypeDto[] = [];

  @Output() fromSave: EventEmitter<any> = new EventEmitter<any>();

  constructor(
    _router: Router,
    injector: Injector,
    private _taxService: TaxServiceProxy,
    private route: ActivatedRoute
  ) {
      super(injector);
      this.router = _router;
   }

  ngOnInit() {
    this.loadData();
    this.getTaxTypes();
  }

  loadData(): void {
    let id = this.route.snapshot.params['id'];
    this._taxService.get(id)
    .subscribe((result: TaxDto) => {
      this.tax = result;
    })
  }

  getTaxTypes(): void {
    this._taxService.getTaxTypes()
    .subscribe((result: ListResultDtoOfTaxTypeDto) => {
        this.taxTypes = result.items;
    });
  }

}

请问我该如何解决?

最佳答案

由于您是异步加载数据,因此 tax 属性最初是 undefined。当 Angular 执行变化检测时,它试图从 [(ngModel)]="tax.taxTypeId" 绑定(bind)中获取值,因此您会收到错误。

有很多方法可以解决这个问题:

1)安全导航运算符(operator)

[ngModel]="tax?.taxTypeId" (ngModelChange)="tax.taxTypeId && tax.taxTypeId = $event"

2) 使用预定义值初始化属性

tax: TaxDto = new TaxDto();

3) 在*ngIf="tax"

中包装模板
<select *ngIf="tax" id="taxTypeId" name="TaxTypeId" [(ngModel)]="tax.taxTypeId" ...>
   <option *ngFor="let tt of taxTypes" value={{tt.id}}>{{tt.name}}</option>
</select>

关于angular - TypeError : Cannot read property 'taxTypeId' of undefined at Object. View_FullEditTaxComponent_0._co [as updateDirectives],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47238349/

相关文章:

javascript - Angular 在单击时将按钮内容添加到数组

angular - 如何对@viewChild ElementRef Angular 进行单元测试

Angular 6 数据绑定(bind)问题

javascript - 为什么 Date.now() | 0 与 Date.now() 不同

html - 在 Angular 中,如何获取具有可扩展内容的 Mat-Table 上的行索引?

reactjs - 使用 React 和 TypeScript 时如何正确输入 @connect?

javascript - 当我点击 Angular 中的 <li> 时,如何更改背景颜色?

javascript - 解决 typescript 错误的最佳方法 - 类型上不存在属性

javascript - 选择 Angular 4 时默认选项为空

Angular2 - 编辑/查看模式下的表单