开发者问题收集

Angular 给出 TypeError:“无法读取未定义的属性‘id’”

2019-03-20
1381

我尝试根据相应表单的 id 获取文档,但响应中出现 “TypeError:无法读取未定义的属性‘id’” 错误: 按钮单击的 html 如下:

                <div class="form-group row">
                <div class="col-md-12" style="text-align: center;">
                  <button (click)="onNext(i)" type="submit" class="btn btn-primary shadow" style="float: right;">NEXT</button>
                </div>
            </div>

我的相应 .ts 文件如下所示:

import { Component, OnInit } from '@angular/core';
import { UsersService } from 'src/app/services/users.service';
import { Router, ActivatedRoute } from '@angular/router';

@Component({
  selector: 'app-admin-higherstudies-form',
  templateUrl: './admin-higherstudies-form.component.html',
  styleUrls: ['./admin-higherstudies-form.component.scss'],
  providers: [UsersService]
})
export class AdminHigherstudiesFormComponent implements OnInit {
  formData: any[];
  constructor(private userService: UsersService, private router: Router, private activatedRoute: ActivatedRoute) { }

  ngOnInit() {
    let formId = this.activatedRoute.snapshot.paramMap.get('formId');
    this.userService.gethigherStudiesFormList(formId).subscribe(
      response => {
        this.formData = response;
        console.log(response);
      }
    );
  }

  logout() {
    return this.userService.logout();
  }
  Back() {
    this.router.navigate(['/admin-higher-studies']);
  }

  onNext(i) {
    let path = '/admin-higherstudies-documents' + this.formData[i].id;
    this.router.navigate([path]);
  }
}

我的服务代码如下:

  gethigherStudiesphdDocumentsList(formid): Observable<any> {
const httpoptions = {
  headers: new HttpHeaders({ 'Authorization': 'token ' + localStorage.getItem('token') })
};
return this.http.post('http://127.0.0.1:8000/api/higher-studies-phd-documents/' + formid + '/', httpoptions);

当我尝试在按钮 div 类中使用 ngFor 时,如代码中所述:

                <div class="form-group row">
                <div class="col-md-12" *ngFor="let data of formData index as i" style="text-align: center;">
                  <button (click)="onNext(i)" type="submit" class="btn btn-primary shadow" style="float: right;">NEXT</button>
                </div>
            </div>

我收到的错误是 找不到类型为‘Name’的不同支持对象‘[object Object]’。NgFor 仅支持绑定到数组等可迭代对象。

2个回答

这是因为您的模板试图在 formData 实际具有值之前访问它,因为在运行之前必须等待异步任务,否则会弹出错误。

<div *ngIf="formData> 添加到父 div,这样您就告诉 angular 等待 formData 在呈现 HTML 之前获取值,因此等待异步方法。

执行此操作的其他方法可能是将 Observable 直接(无需调用 .subscribe)传递给 DOM,并使用异步管道

让 (formData |async) 的数据索引为 i 并在您的组件中简单地将 formData 设为可观察对象


注意:

此外, 您可以使用 location.back() 返回到上一个 url,而不是创建路由方法。我知道,偏离主题,但只是为了让你知道了!

编辑:

还有一件事情需要注意......通常当你得到“无法读取未定义的属性”错误时,通常意味着它试图访问不存在的东西(想到了拼写错误),或者试图访问它存在之前的东西!

Francisco Santorelli
2019-03-20

您的循环应如下所示:

*ngFor="let data of formData; let i = index"

*ngFor="let data of formData; index as i"

同时在 div 上添加 if 检查

<div *ngIf="formData.length > 0" class="form-group row">
Muhammad Abdullah Shafiq
2019-03-20