开发者问题收集

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

2020-06-30
433

我的 html 文件中有这样的 div 标签:

<div *ngIf="chat.asReceiver.id != user?.id; else otherParty">

并且它总是返回此错误

ERROR TypeError: Cannot read property 'id' of undefined

我多次测试了我的变量并且 chat.asReceiver.iduser?.id 都有值,然后我将我的 div 放在 *ngIf 下,如下所示:

<div *ngIf="user">
   <div *ngIf="chat.asReceiver.id != user?.id; else otherParty">
      //....
   </div>
</div>

仍然存在错误。

component

public user: User;
chats: any[] = [];

constructor( ) {
    this.getChats();
}

ionViewWillEnter() {
    this.authService.user().subscribe(
      user => {
        this.user = user;
      }
    );
}

getChats() {
    this.privateChatService.getChats().subscribe((res) => {
      for (const chat of res.data) {
        this.chats.push(chat);
      }
    });
}

有什么想法吗?

更新

我的数据是什么样的

one

更新 2

<div *ngIf="chats.length>0">
    <ion-item-sliding *ngFor="let chat of chats; index as indexOfelement;">
        <div *ngIf="chat.asReceiver.id != user?.id; else otherParty">
            <ion-item class="chat-groups">
                <ion-avatar slot="start">
                <div *ngIf="chat.asReceiver.photo != null; else placeholderImage">
                    <img (click)="openImageRes(chat)" class="gImage" routerDirection="forward" [src]="chat.asReceiver.photo">
                </div>
                <ng-template #placeholderImage>
                    <img routerDirection="forward" class="gImage" src="../../assets/placeholders/avatar.jpg">
                </ng-template>
                </ion-avatar>
                <ion-label routerDirection="forward" [routerLink]="['/tabs/', 'chat', chat.id]">
                    <h2 style="float: left;width: 80%;"slot="start" [innerHTML]="chat.asReceiver.username"></h2>
                    <ion-badge slot="end" color="primary">{{totalBadges}}</ion-badge>
                </ion-label>
            </ion-item>
        </div>
    </ion-item-sliding>
  </div>
2个回答

问题是 chat 对象中的 asReceiver 属性不存在。 在您提供的代码中,您没有显示 chat 的定义,您能否也发布它?如果您不知道它到底是什么,您可以尝试为聊天添加 ngIf 中的问号。

<div *ngIf="chat?.asReceiver?.id !== user?.id; else otherParty">

这里的问题是,如果两个 id 都未定义,您也会进入 else 语句,而不仅仅是它们相等。

Felix Lemke
2020-06-30

也许使用类似

<div *ngIf="(chat && chat.asReceiver && user) && (chat.asReceiver.id !== user?.id); else otherParty">

此外,我建议使用异步管道重写所有内容

Yura Rudnychenko
2020-06-30