在Angular 5中渲染视图之前等待数据

user2304483:

我是Angular 5的新手,能够使用subscription访问服务方法来创建视图,但是在渲染延迟方面遇到问题。用户看到第一个“未定义”字符串,并在0.5秒后更改为正确的值。

这是该组件的.ts文件:

 public trips: Trip[];
  public numberOfUsers : Map<string, number> = new Map<string, number>();

  constructor(private tripService: TripService) { }

  ngOnInit() {
   this.getTrips();
  }

  getTrips() {
    this.tripService.getTripForMe().subscribe(
      data => { this.trips = data;},
      err => console.error(err),
      () => this.initNumberOfUsers()
    );
  }

  initNumberOfUsers() {
    for (let i = 0; i < this.trips.length; i++) {
      let count;
      this.tripService.getNumberOfUsers().subscribe(
        data => { count = data},
        err => console.error(err),
        () => this.numberOfUsers.set(this.trips[i].id, count)
      );


      ;
    }
  }

  getNumberOfUsers(data) {
    return this.numberOfUsers.get(data.id);
  }

在第一次订阅完成之后会调用initNumberOfUsers方法,这很好,但是可能在之前调用了getNumberOfUsers(data)并得到“未定义”。

这是模板中的相关部分(“数据”是ngFor循环的当前值):

<span [innerText]="getNumberOfUsers(data)"></span>

有没有一种方法可以确保在渲染之前依次完成这两种订阅方法?

更新

我能够创建一个解析器,然后conconle显示对象,但是,我很难将数据传递给组件。

相对代码:

import { Injectable } from '@angular/core';
import { Router, Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { Trip} from ....
import { TripService } from .....
import { Observable } from 'rxjs/Rx';

@Injectable()
export class TripsResolve implements Resolve<Trip[]> {

   public trips: Trip[];

   constructor(private service: TripService) {}

   resolve(route: ActivatedRouteSnapshot, 
           state: RouterStateSnapshot) {
     this.service.getTrips().subscribe(
        data => { this.trips = data },
        err => console.error(err),
        () => console.log(this.trips)
      );
      return this.trips;
   }
}

从路线

resolve: {
         trips: TripsResolve
      }

从模块

providers: [
        ...
        TripsResolve,
        ...

组件中的数据不是通过/不是avilavle:

import { Component, OnInit } from '@angular/core';
import { Trip } from ...
import { Router, ActivatedRoute } from '@angular/router';

@Component({
  selector: ...
  templateUrl: ...
  styleUrls: ...
})
export class MyComponent implements OnInit {

    public trips: Trip[];

    constructor(private route: ActivatedRoute,
                private router: Router) {
    }

    ngOnInit() {
        this.route.data.forEach(data => {
            this.trips = data.trips;
            console.log(this.trips);  //can't see it
       });

    } 
}

知道如何访问/检索组件中的数据吗?

潘迪扬酷:

通过API调用处理数据时,我也遇到了类似的问题

我尝试了两种解决方案

一个正在使用* ngIf

DOM仅在数据准备就绪时填充。

<div *ngIf="isLoaded">Text to show</div>

另一种方法是使用resolver,在呈现视图之前,它将准备数据。但是有时,如果数据加载花费太多时间,解析器会使屏幕空白。

@Injectable()
export class HeroDetailResolve implements Resolve {
    constructor(private heroService: HeroService, private router: Router) { }

    resolve(route: ActivatedRouteSnapshot): Promise | boolean {
        let id = +route.params['id'];
        return this.heroService.getHero(id).then(hero => {
            if (hero) {
                return hero;
            } else { // id not found
                this.router.navigate(['/dashboard']);
                return false;
            }
        });
    }
}

因此,您现在有两个选择。

我会建议* ngIf。在数据加载过程中,显示​​一些加载器gif或一些消息,以使用户知道后台发生了某些事情。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在渲染视图/模板之前,等待Angular 2加载/解析模型

来自分类Dev

在 Angular 7 中渲染组件之前加载数据

来自分类Dev

Angular JS在返回之前等待数据

来自分类Dev

用于在 Angular 中重新渲染视图模板的差异可观察等待和 setTimeout

来自分类Dev

Angular 2 在渲染模板之前加载数据

来自分类Dev

渲染模板之前的Angular 6等待服务响应

来自分类Dev

在angular2中渲染编辑表单。如何等待服务中的数据?

来自分类Dev

Angular5:在观察到的数据返回之前,需要阻止ngbTooltip渲染

来自分类Dev

如何等待渲染组件,直到在Angular 2中收集了所有数据

来自分类Dev

更新DOM与在Angular中渲染视图

来自分类Dev

在 angular 2 查看之前如何等待数据加载

来自分类Dev

Angular2:如何在渲染组件之前加载数据?

来自分类Dev

在Angular中进行模板渲染之前加载数据

来自分类Dev

Angular2 Observable在数据更改之前不渲染

来自分类Dev

如何在 Angular 5 中渲染 PDF?

来自分类Dev

在Angular 5应用中渲染PDF

来自分类Dev

等待$ rootScope值在页面加载之前在Angular中解析

来自分类Dev

如何使Angular2在渲染组件之前等待一个承诺

来自分类Dev

等待方法Angular 5

来自分类Dev

angular:等待异步数据

来自分类Dev

如何检测何时在Angular中渲染视图元素?

来自分类Dev

在Angular 6的iframe中渲染视图并继续使用模板变量

来自分类Dev

Angular Js-角度树视图指令中的html渲染

来自分类Dev

Angular ui-router:如何在解决孩子的问题之前渲染父视图?

来自分类Dev

从对象的数据数组中填充视图 Angular

来自分类Dev

如何在Laravel中渲染之前更改视图分配的数据?

来自分类Dev

如何使Angular动画等待渲染完成

来自分类Dev

Angular 4中渲染组件中未接收到数据

来自分类Dev

获取组件以在渲染之前等待异步数据

Related 相关文章

  1. 1

    在渲染视图/模板之前,等待Angular 2加载/解析模型

  2. 2

    在 Angular 7 中渲染组件之前加载数据

  3. 3

    Angular JS在返回之前等待数据

  4. 4

    用于在 Angular 中重新渲染视图模板的差异可观察等待和 setTimeout

  5. 5

    Angular 2 在渲染模板之前加载数据

  6. 6

    渲染模板之前的Angular 6等待服务响应

  7. 7

    在angular2中渲染编辑表单。如何等待服务中的数据?

  8. 8

    Angular5:在观察到的数据返回之前,需要阻止ngbTooltip渲染

  9. 9

    如何等待渲染组件,直到在Angular 2中收集了所有数据

  10. 10

    更新DOM与在Angular中渲染视图

  11. 11

    在 angular 2 查看之前如何等待数据加载

  12. 12

    Angular2:如何在渲染组件之前加载数据?

  13. 13

    在Angular中进行模板渲染之前加载数据

  14. 14

    Angular2 Observable在数据更改之前不渲染

  15. 15

    如何在 Angular 5 中渲染 PDF?

  16. 16

    在Angular 5应用中渲染PDF

  17. 17

    等待$ rootScope值在页面加载之前在Angular中解析

  18. 18

    如何使Angular2在渲染组件之前等待一个承诺

  19. 19

    等待方法Angular 5

  20. 20

    angular:等待异步数据

  21. 21

    如何检测何时在Angular中渲染视图元素?

  22. 22

    在Angular 6的iframe中渲染视图并继续使用模板变量

  23. 23

    Angular Js-角度树视图指令中的html渲染

  24. 24

    Angular ui-router:如何在解决孩子的问题之前渲染父视图?

  25. 25

    从对象的数据数组中填充视图 Angular

  26. 26

    如何在Laravel中渲染之前更改视图分配的数据?

  27. 27

    如何使Angular动画等待渲染完成

  28. 28

    Angular 4中渲染组件中未接收到数据

  29. 29

    获取组件以在渲染之前等待异步数据

热门标签

归档