在运行时调用 Observable 并渲染结果

Call Observable on runtime and render the result

我有一个视图,当点击这样的按钮时

  <a class="button" (click)="takeInpit(id)" routerLinkActive="activebutton"  >Request</a>

触发此 takeInput 方法

public takeInpit(Id:string): void{

    let navigationExtras: NavigationExtras = {
      queryParams: {
        "id":Id
      }
  };
  this.router.navigate(["request"], navigationExtras);
  }

然后我导航到这个名为请求的组件:

//takes parameters from container
  public constructor(private route: ActivatedRoute, private itemService: SingleItemService) {
    this.route.queryParams.subscribe(params => {
        this.requestedItem = params["id"];
        this.itemService.setIDs(this.requestedItem);
        this.itemService.getSingleItemRequest();
    });
    this.item = this.itemService.getName();
    //console.log(this.item);
    
}

我调用此服务的想法是我可以从 API

中动态获取数据
export class SingleItemService {

  urlSingle:string = 'http://localhost:8080/getSpecificItem?itemId=';
  item:any;
  
  constructor(private htpp: HttpClient){
  }

  public setIDs(id:string){
    this.urlSingle + id;
}

  public getSingleItemRequest():void{
     this.htpp.get<Item>(this.urlSingle).subscribe( data=>{
     this.item = data;
     console.log("data is", data);
     }
   );
   }

   public getName(): string{
      return this.item.name;
    
   }
}

然后在请求组件视图(基本上调用服务的视图)中记录数据

<div ngIf* ="item"><div>{{item}}</div>
</div>

但是没有记录信息。检查控制台我看到这条消息:

ERROR Error: Uncaught (in promise): TypeError: this.item is undefined
getName@http://localhost:4200/main.js:368:9

所以它会在可观察对象完成之前尝试访问服务的 get 方法。我该如何解决?

SingleItemService return Observable from getSingleItemRequest 中,使用 tap 将响应分配给项目。

import { tap } from 'rxjs/operators';

public getSingleItemRequest():Observable<any>{
     return this.htpp.get<Item>(this.urlSingle).pipe(
        tap(data => this.item = data)
    );
}

RequestComponent

item = '';

this.route.queryParams.subscribe(params => {
    this.requestedItem = params["id"];
    this.itemService.setIDs(this.requestedItem);
    this.itemService.getSingleItemRequest()
    .subscribe(_ => this.item = this.itemService.getName());
    // .subscribe(response => this.item = response.name);
});