Angular 2 - 显示来自promise的异步对象数据

时间:2015-12-18 20:06:48

标签: asynchronous angular

编辑:现在看来我的主要问题是我似乎无法显示来自对象的异步数据。我有一个包含数据对象的promise,当我使用

{{ data | async }}

它会显示

[object Object]

问题是,我希望能够显示所有不同的属性;即名称,符号等。在Angular 1中,我只会使用

{{ data.Name | async }}

但这不起作用,因为异步管道试图解析不存在的data.Name promise。我想解析数据承诺,然后从中显示Name键。目前,我正在创建自己的管道来显示来自异步对象的密钥,但我想知道是否有内置的Angular 2管道或函数来处理这个问题! / p>

我创建了一个StockService类,它返回一个包含我的StockInfo类对象的Promise,其中包含要显示的HTML。我想在我的HTML中显示该对象的名称,但我似乎无法显示它。

在我的StockInfo构造函数中:

this.stock.getStockData(this.ticker, http).then(function(val) {
  this.data = val;

  this.name = new Promise<string>(function(resolve) {
    resolve(this.data.Name);
  });
});

其中this.stock是StockService对象。

在我的HTML中:

<h2>{{name | async}}</h2>

我在解决这个问题之前尝试了许多不同的安排。我希望StockService类处理数据提取和StockInfo类来处理显示。在Angular 1中,我将创建一个工厂来获取数据并处理控制器中的数据处理,但我不太确定如何在Angular 2中进行此操作。

有没有办法让它显示,还是有更好的方法来设计我应该研究的代码?谢谢!

7 个答案:

答案 0 :(得分:62)

您不需要任何特殊管道。 Angular 2支持可选字段。你只需要添加?在你的对象

{{ (data | async)?.name }}

{{(name | async)?}}

答案 1 :(得分:7)

您还可以使用pluck / observable中的rxjs

{{ user.pluck("name") | async }}

Pluck 返回一个Observable,其中包含Observable序列中所有元素的指定嵌套属性的值。如果无法解析某个属性,则会为该值返回undefined。

答案 2 :(得分:6)

上面接受的answer没有错。但是当我们需要显示对象的许多属性时,附加| async?会变得很麻烦。 更方便的解决方案如下:

<div *ngIf="data | async as localData">
   <div> {{ localData.name }} </div>
   <div> {{ localData.property1 }} </div>
   <div> {{ localData.property2 }} </div>
</div>

答案 3 :(得分:2)

如果您使用Observable,您可以这样显示数据:

<div *ngIf="data | async; let _data">
   <h3>{{_data.name}}</h3>
</div>

<h3>{{(data | async).name}}</h3>

答案 4 :(得分:1)

我认为你这太复杂了,只需要这样做。

this.name = 
  this.stock.getStockData(this.ticker, http)
  .then( val => val.Name )

<h2>{{name.Name | async}}</h2>

答案 5 :(得分:0)

所以我最终编写了自己的异步密钥管道。非常感谢Simon帮助指导我。

import {Pipe} from 'angular2/core';

@Pipe({
    name: 'key',
    pure: false
})

export class KeyPipe {
    private fetchedPromise: Promise<Object>;
    private result: string;

    transform(value: Promise<Object>, args: string[]) {
        if(!this.fetchedPromise) {
            this.fetchedPromise = value
                .then((obj) => this.result = obj[args[0]] );
        }
        return this.result;
    }
}

用法:

<h2>{{ data | key: 'Name' }}</h2>

有人请评论Angular是否有自己的函数来解析异步对象中的密钥。

答案 6 :(得分:0)

OP要求诺言,但是如果人们使用Observable来适应@ user2884505的答案,因为pluck在RxJS的最新版本中不是直接可用于可观察对象的,因此您可以像这样:

import { Pipe, PipeTransform } from '@angular/core';

import { Observable } from 'rxjs';
import { pluck } from 'rxjs/operators';

@Pipe({
  name: 'asyncKey',
  pure: false
})
export class AsyncKeyPipe implements PipeTransform {
  private observable: Observable<Object>;
  private result: Object;

  transform(value: any, ...args: any[]): any {

    if (!this.observable) {
      this.observable = value.pipe(pluck(...args));
      this.observable.subscribe(r => this.result = r);
    }

    return this.result;
  }
}

然后,即使对于嵌套键,也可以使用它:

{{ user$ | asyncKey: 'address' : 'street' }}