代码之家  ›  专栏  ›  技术社区  ›  e2rabi

角度5-可观测返回误差不能读取未定义的属性

  •  0
  • e2rabi  · 技术社区  · 7 年前

    当我使用 httpclient公司 A使用请求的页面获得正确的响应它在我的页面上正确显示数据,但控制台Web浏览器出现错误 *NGFOR公司 尽管模板正确显示结果,但循环无法读取未定义的属性:

    问题在于服务方法: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>
    

    有人能帮我找到我的可观测数据的问题吗 提前谢谢

    1 回复  |  直到 7 年前
        1
  •  2
  •   user184994    7 年前

    因为 getPageClient 函数是异步的, pageClient 首次加载页时未定义。也就是说当你 pageClient.content ,将得到一个错误。

    谢天谢地,angular提供了一些有用的语法,您可以在模板中使用这些语法来避免这种情况。你应该用 *ngIf="pageClient?.content" > 相反。

    这个 ? 告诉Angular只读取 content 如果 页面客户端 不为空/未定义。

    More info here

    推荐文章