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

Posted

技术标签:

【中文标题】Angular给出TypeError:“无法读取未定义的属性\'id\'”【英文标题】:Angular giving TypeError: "Cannot read property 'id' of undefined"Angular给出TypeError:“无法读取未定义的属性'id'” 【发布时间】:2019-08-11 14:11:22 【问题描述】:

我正在尝试根据相应表单的 id 获取文档 "TypeError: Cannot read property 'id' of undefined" 响应中出现错误: 按钮点击的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>

我收到的错误是 找不到类型为“名称”的不同支持对象“[对象对象]”。 NgFor 只支持绑定到数组等 Iterables。

【问题讨论】:

【参考方案1】:

这是因为你的模板在它真正有价值之前尝试访问formData,因为异步任务必须在运行之前等待,否则会弹出错误。

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

其他方法可以将 Observable 直接传递(不需要调用 .subscribe)到 DOM,并使用异步管道

let data of (formData |async) index as i 并在您的组件中简单地使 formData 成为可观察的


注意:

还有, 您可以使用location.back() 返回上一个url,而不是创建路由方法。我知道,跑题了,只是想让你知道!

编辑:

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

【讨论】:

或者如果你不想添加额外的 DOM 元素,你也可以使用 &lt;ng-container *ngIf="formData" &gt; ... &lt;/ng-container&gt; 而不是 div (这里有详细信息,但我用这些从条件无用中节省了很多 DOM 树的可读性生成的结构) 我将按钮 div 更改如下: 现在它给出了错误“ InvalidPipeArgument: '[object Object]' for pipe 'AsyncPipe'” 要使用异步管道,你必须传递一个 Observable.. 这意味着 formatData 没有订阅......但是如果你现在很难使用 rxjs,请坚持你所做的。 .. 另外,将 *ngIf 添加到 *ngFor 的父对象中(不能将 ngIf 和 ngFor 添加到同一个元素)希望它有效【参考方案2】:

你的循环应该是这样的:

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

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

另外添加一个if 检查div

<div *ngIf="formData.length > 0" class="form-group row">

【讨论】:

以上是关于Angular给出TypeError:“无法读取未定义的属性'id'”的主要内容,如果未能解决你的问题,请参考以下文章

Angular 6:TypeError:无法读取未定义的属性“值”

Angular 2:TypeError:无法读取未定义的属性“isRouteActive”

Angular,TypeError:无法读取未定义的属性“排序”

Angular 13 Webpack 异常:TypeError:无法读取未定义的属性(读取“NODE_DEBUG”)

Angular Karma - TypeError:无法读取未定义的属性“_id”

Angular Test Jest - TypeError:无法读取未定义的属性“queryParams”