Angular 2 - Observable 更新返回值

Angular 2 - Observable update the returned value

如何更新返回值以便在完成时显示?

从 html 调用它是这样的:

// the item.username is from a higher loop which works.
<div *ngFor="let eqItem of getTest(item.username)">



getTest(username: string): Item[] {
let itemArray: Item[];
this.usersService.subscribeItemsForUsername(username).subscribe(z => {
    itemArray = z;
    //return z;
});
return itemArray;
}

这是服务:

  subscribeItemsForUsername(username: string): Observable<Item[]> {
      let returnedList =   this.af.database.list('users', {
        query: {
            orderByChild: 'username',
            equalTo: username,
        }
    });

    return returnedList;
  }

通过使用异步管道

参考:https://angular.io/docs/ts/latest/guide/pipes.html#async-pipe

将视图更改为:

<div *ngFor="let eqItem of getTest(item.username) | async">

getTest 方法应该 return 一个像这样的可观察对象:

getTest(username: string): Observable<Item[]> {
    return this.usersService.subscribeItemsForUsername(username).map(res=> res.json());
}

您作为参数发送给 subscribe 方法的函数是一个回调,将来会调用。它可能会在 getTest 方法完成他的工作后被调用,所以你的回调将执行:itemArray = zitemArray 目前不存在。

这就是为什么视图中的行 <div *ngFor="let eqItem of getTest(item.username)"> 等同于 <div *ngFor="let eqItem of []">(如果订阅方法中的回调将在 getTest 方法完成后执行。

解决方案:

如@echonax 所述,Async 将是最佳解决方案。

<div *ngFor="let eqItem of getTest(item.username) | async">

getTest(username: string):Observable<Item[]>{
return this.usersService.subscribeItemsForUsername(username);
}

简而言之:异步管道将订阅和取消订阅(在组件应该被销毁之后)并将 return 到 ngFor 数组(在这种情况下)。