使用异步管道和 Observables
Angular 中的管道就像 Linux 中的管道一样工作。它们接受输入并产生输出。输出将由管道的功能决定。这个管道接受一个 promise 或 observable 作为输入,它可以在 promise 被解析或 observable 发出一些新值时更新模板。与所有管道一样,我们需要在模板中应用管道。
假设我们有一个 API 返回的产品列表,并且我们有以下可用服务:
// api.service.ts
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
@Injectable()
export class ApiService {
constructor(private http: HttpClient) { }
getProducts() {
return this.http.get('http://localhost:3000/api/products');
}
}
上面的代码很简单——我们指定了返回 HTTP GET 调用的 getProducts() 方法。
是时候在组件中使用这个服务了。我们在这里要做的是创建一个 Observable 并将 getProducts() 方法的结果分配给它。此外,我们将每 1 秒调用一次,因此如果 API 级别有更新,我们可以刷新模板:
// some.component.ts
import { Component, OnInit, OnDestroy, Input } from '@angular/core';
import { ApiService } from './../api.service';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/interval';
import 'rxjs/add/operator/startWith';
import 'rxjs/add/operator/switchMap';
@Component({
selector: 'app-products',
templateUrl: './products.component.html',
styleUrls: ['./products.component.css']
})
export class ProductsComponent implements OnInit {
@Input() products$: Observable<any>;
constructor(private api: ApiService) { }
ngOnInit() {
this.products$ = Observable
.interval(1000)
.startWith(0).switchMap(() => this.api.getProducts());
}
}
最后但同样重要的是,我们需要在模板中应用异步管道:
<ul>
<li *ngFor="let product of products$ | async">{{ product.prod_name }} for {{ product.price | currency:'£'}}</li>
</ul>
这样,如果我们将新项目推送到 API(或删除一个或多个项目),更新将在 1 秒内显示在组件中。