我是Angular 5的新手,能够使用subscribe创建具有服务方法访问权限的视图,但在渲染中遇到延迟问题.用户看到第一个"未定义"字符串,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方法是在第一次subscribe完成后调用的,这很好,但是getNumberOfUsers(数据)可能是在之前调用的,并且得到"undefined".

以下是模板中的相关部分("数据"是ngFor循环的当前值):

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

有没有办法确保两种订阅方法在渲染之前都按顺序完成?

UPDATE

我能够创建一个解析器,concole显示对象,但我很难将数据传递给组件.

Reolver code:

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;
   }
}

From route

resolve: {
         trips: TripsResolve
      }

From module

providers: [
        ...
        TripsResolve,
        ...

Data is not pass/not avilavle in the component:

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调用处理数据时,我也遇到过类似的问题

我try 了两种解决方案

一个是使用*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;
            }
        });
    }
}

所以你现在有两个 Select .

我建议在加载数据的过程中,显示一些加载gif或一些消息,让用户知道后台发生了什么.

Typescript相关问答推荐

如何让这个函数正确推断返回类型?

为什么当我试图从数据库预填充时,属性x不存在于类型{错误:字符串; }.ts(2339)上?

Typescript联合类型-字段类型覆盖

从传递的数组中出现的值设置返回键的类型

如果我有对象的Typescript类型,如何使用其值的类型?

如何在TypeScript对象迭代中根据键推断值类型?

typescribe不能使用值来索引对象类型,该对象类型满足具有该值的另一个类型'

为什么从数组中删除一个值会删除打字错误?

Angular 行为:属性类型从SignalFunction更改为布尔

状态更新后未触发特定元素的Reaction CSS转换

类型脚本中没有接口的中间静态类

是否将自动导入样式从`~/目录/文件`改为`@/目录/文件`?

vue-tsc失败,错误引用项目可能无法禁用vue项目上的emit

根据类型脚本中的泛型属性 Select 类型

API文件夹内的工作员getAuth()帮助器返回:{UserID:空}

如何使这种一对一关系在旧表上起作用?

错误:NG02200:找不到类型为';对象';的其他支持对象';[对象对象]';.例如数组

Select 类型的子项

我可以使用对象属性的名称作为对象中的字符串值吗?

基于参数的 TS 返回类型