“错误TypeError:无法读取未定义的属性'name'” Angular

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了“错误TypeError:无法读取未定义的属性'name'” Angular相关的知识,希望对你有一定的参考价值。

我不确定我在这里做错了什么。在用户登录仪表板的工具栏后尝试显示用户名,但是当尝试调用我创建的名为UserDetails的界面时,浏览器控制台显示UserDetails的名称未定义。我确保从其他文件导入了UserDetails。

我在这里有我的组件ts文件

import  Component, OnInit  from "@angular/core";
import 
  BreakpointObserver,
  BreakpointState,
  Breakpoints
 from "@angular/cdk/layout";
import  Observable  from "rxjs";
import 
  AuthenticationService,
  UserDetails
 from "../auth/authentication.service";

@Component(
  templateUrl: "./portal.component.html",
  styleUrls: ["./portal.component.scss"]
)
export class PortalComponent 
  details: UserDetails;

  isHandset: Observable<BreakpointState> = this.breakpointObserver.observe(
    Breakpoints.Handset
  );
  constructor(
    private breakpointObserver: BreakpointObserver,
    private auth: AuthenticationService
  ) 

  ngOnInit() 
    this.auth.profile().subscribe(
      user => 
        this.details = user;
      ,
      err => 
        console.error(err);
      
    );
  

和我的组件模板在这里

<mat-sidenav-container>
  <mat-sidenav
    #drawer
    mode="side"
    opened
    fixedInViewport="true"
    [attr.role]="isHandset ? 'dialog' : 'navigation'"
    [mode]="(isHandset | async)!.matches ? 'over' : 'side'"
    [opened]="!(isHandset | async)!.matches"
  >
    <span><h1>Maersk</h1></span>
    <mat-divider></mat-divider>
    <mat-nav-list>
      <ul>
        <li>
          <a routerLink="/portal/dashboard">
            <button mat-flat-button color="accent">
              DASHBOARD
            </button>
          </a>
        </li>
        <li>
          <a routerLink="/portal/orders">
            <button mat-flat-button color="accent">
              ORDERS
            </button>
          </a>
        </li>
        <li>
          <a routerLink="/portal/stats">
            <button mat-flat-button color="accent">
              STATISTICS
            </button>
          </a>
        </li>
      </ul>
    </mat-nav-list>
  </mat-sidenav>
  <mat-sidenav-content>
    <mat-toolbar>
      <mat-toolbar-row>
        <button
          type="button"
          aria-label="Toggle sidenav"
          mat-icon-button
          (click)="drawer.toggle()"
          *ngIf="(isHandset | async)!.matches"
        >
          <mat-icon aria-label="Side nav toggle icon">menu</mat-icon>
        </button>
        <span class="right-align"></span>
        <button mat-button [matMenuTriggerFor]="menu">
           details.name 
        </button>
        <mat-menu #menu="matMenu">
          <a (click)="auth.logout()">
            <button mat-menu-item>
              LOGOUT
            </button>
          </a>
        </mat-menu>
      </mat-toolbar-row>
    </mat-toolbar>
    <router-outlet></router-outlet>
  </mat-sidenav-content>
</mat-sidenav-container>

控制台不断吐出“错误TypeError:无法读取未定义的属性'名称'”。不知道为什么在ts文件中找不到详细信息。


更新:

发现详细信息本身未定义后,发布了更多代码。这是我从authentication.service.ts对profile()的调用

public profile(): Observable<any> 
    return this.request("get", "profile");
  

然后是request(),它在profile()中被调用

private request(
    method: "post" | "get",
    type: "login" | "register" | "profile",
    user?: TokenPayload
  ): Observable<any> 
    let base;

    if (method === "post") 
      base = this.http.post("http://localhost:3000" + `/api/$type`, user);
     else 
      base = this.http.get("http://localhost:3000" + `/api/$type`, 
        headers:  Authorization: `Bearer $this.getToken()` 
      );
    

    const request = base.pipe(
      map((data: TokenResponse) => 
        if (data.token) 
          this.saveToken(data.token);
        
        return data;
      )
    );

    return request;
  

另外,以防万一,这里还有一些在request()中被调用的方法

private saveToken(token: string): void 
    localStorage.setItem("mean-token", token);
    this.token = token;
  

  private getToken(): string 
    if (!this.token) 
      this.token = localStorage.getItem("mean-token");
    
    return this.token;
  

登录用户时,这里的一切工作正常。

答案

使用如下所示的在按钮内部(显示名称的地方)使用安全的导航操作符,

<button mat-button [matMenuTriggerFor]="menu">
     details?.name 
</button>

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

jQuery DataTables 错误 - TypeError:无法读取未定义的属性“fnInit”

[Vue 警告]:渲染错误:“TypeError:无法读取未定义的属性 'NomeStr'”

挂载钩子中的错误:“TypeError:无法读取未定义的属性 'allStage'”

测试组件 - 挂载钩子中的错误:“TypeError:无法读取未定义的属性 'dispatch'”

指令 Dragula 更新挂钩中的错误:“TypeError:无法读取未定义的属性 'drake'”

Vue警告]:渲染错误:“TypeError:无法读取未定义的属性'map'”Vue Google地图[重复]