javascript - Angular 5 - 可观察的返回错误无法读取未定义的属性

标签 javascript angular angular4-httpclient angular-observable

当我使用 httpClient 调用我的 Web 服务时,我开始在我的 Angular 服务中使用 Spring Rest 和 Angular 5 实现一个简单的分页,并在其显示数据的请求页面上获得正确的响应我的页面正确,但控制台 Web 浏览器出现错误,表明我的 *ngFor 循环中存在错误,无法读取未定义的属性,尽管模板正确显示结果:

问题出在 Service 方法中:getPageClient() 和 *ngFor 指令 这是我的错误日志: enter image description here

这是我使用可观察的服务:

import { Injectable } from '@angular/core';
import {Client} from '../models/Client'
import {PageClient} from '../models/PageClient'
import { Observable, of } from 'rxjs';
import { HttpClient,HttpHeaders } from '@angular/common/http';
import {catchError,map,tap} from 'rxjs/operators';

@Injectable({
  providedIn: 'root'
})
export class ClientService {

  private url = 'http://localhost:8099/api/clients';

  private urlPage = 'http://localhost:8099/api/clients/get?page=0&size=3';

  getClient(): Observable<Client[]>{
     return this.http.get<Client[]>(this.url)
      .pipe(
           catchError(this.handleError('getClient', []))
      );
  }

 getPageClient(): Observable<PageClient>{
  return this.http.get<PageClient>(this.urlPage)
  .pipe(
    map(response => {
      const data = response;
      console.log(data.content);
      return data ;
    }));
}
  constructor(private http : HttpClient) { }

  private handleError<T> (operation = 'operation', result?: T) {
    return (error: any): Observable<T> => {

      // TODO: send the error to remote logging infrastructure
      console.error(error); // log to console instead

      // TODO: better job of transforming error for user consumption
      console.log(`${operation} failed: ${error.message}`);

      // Let the app keep running by returning an empty result.
      return of(result as T);
    };
  }
}

这是我的模型类:

import {Client} from '../models/Client' ;  

export class PageClient {
    content : Client[];
    totalPages : number;
    totalElements : number;
    last : boolean;
    size : number ;
    first : boolean ;
    sort : string ;
    numberOfElements : number ;
}

这是我的组件代码:

import { Component, OnInit } from '@angular/core';
import {Client} from '../models/Client' ;
import {PageClient} from '../models/PageClient'
import {ClientService} from '../services/client.service' ;

@Component({
  selector: 'app-clients',
  templateUrl: './clients.component.html',
  styleUrls: ['./clients.component.css']
})
export class ClientsComponent implements OnInit {

  clients : Client[];
  pageClient : PageClient ;

  getClient(): void {
    this.clientService.getClient()
        .subscribe(clients => this.clients = clients);
  }

  getPageClient(): void {
    this.clientService.getPageClient()
        .subscribe(page => this.pageClient = page);

  }
  constructor(private clientService : ClientService) { }

  ngOnInit() {
     this.getClient();
     this.getPageClient();
  }

}

这是我的模板部分,它实现了分页:

<nav aria-label="...">
  <ul class="pagination"  *ngIf="pageClient.content" >
    <li class="page-item disabled">
      <a class="page-link" href="#" tabindex="-1">Previous</a>
    </li>
    <li *ngFor="let page of pageClient.content ; let i=index " class="page-item"><a class="page-link" href="#">{{i}}</a></li>
   <!-- <li class="page-item active">
      <a class="page-link" href="#">2 <span class="sr-only">(current)</span></a>
    </li>-->
    <li class="page-item">
      <a class="page-link" href="#">Next</a>
    </li>
  </ul>
</nav>

有人可以帮我找到我的 Observable 的问题吗 提前致谢

最佳答案

由于 getPageClient 函数是异步的,因此在页面首次加载时 pageClient 未定义。这意味着在执行 pageClient.content 时,您将收到错误。

幸运的是,Angular 提供了一些有用的语法,您可以在模板中使用它来避免这种情况。您应该使用 *ngIf="pageClient?.content"> 来代替。

? 告诉 Angular 仅在 pageClient 不为 null/未定义时读取 content

More info here

关于javascript - Angular 5 - 可观察的返回错误无法读取未定义的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51227674/

相关文章:

angular - 为什么在此 ngrx 示例中需要 takeUntil?

即使未选择单选按钮,Angular Reactive 也会验证

javascript - Angular 路由通过手动刷新或直接输入 url 进入主页

angular - 使用 HttpClient 拦截器的加载器 Angular 4

javascript - 无类型函数调用可能不接受类型参数 - Angular 5 http 调用

javascript Number 构造函数奇怪的行为

javascript - 弹出模式仅适用于表中的第一个元素,第二次单击后不会再次打开

angular - Angular 4 中将多个数据发布到服务器

javascript - 通过数组过滤并返回具有匹配模式的新数组

javascript - 驱动器API : DeadlineExceededException when updating a file