【问题标题】:Async Pipe Not Handling Subscription as Expected in Angular 2 AppAngular 2 应用程序中的异步管道未按预期处理订阅
【发布时间】:2017-10-15 23:56:06
【问题描述】:

我已经在整个 Angular 应用程序中成功使用了 Observables。到目前为止,我一直在组件中显式订阅,然后使用 *ngFor 迭代视图中的记录数组。现在我想通过在各种视图中使用 Angular 的异步管道来简化事情——这样就可以处理订阅和取消订阅。到目前为止,这不起作用。

这是我最初拥有的(我在组件中订阅的地方):

ngOnInit() {
    this.clientService.getAll(1, this.pagesize)
        .subscribe(resRecordsData => {
            this.records = resRecordsData;
            console.log(this.records);
        },
        responseRecordsError => this.errorMsg = responseRecordsError);
}

然后在视图中我正在执行以下操作:

<tr *ngFor="let record of records.data>

顺便说一下,API 的数据结构如下所示(我迭代的记录在“data”数组中,因此在上面的 *ngFor 中为“records.data”):

{
  "count": 15298,
  "data": [
    {

因此,为了转而使用异步管道,我将组件 ngOnInit 调用更改为 this,我在其中明确声明 this 是可观察的,并将其分配给变量“records”:

ngOnInit() {
    const records: Observable<any> = this.clientsService.getAll(1, this.pagesize);
    console.log(this.records);
}

我还将 RxJs 的可观察导入引入到组件中,如下所示:

import { Observable } from 'rxjs/Observable';

然后在视图中我添加了异步管道,如下所示:

<tr *ngFor="let record of records.data | async">

正如我所提到的,这是行不通的。我没有收到任何控制台错误,只是没有看到任何数据填充到视图中。另外,在控制台中,“records”是一个空数组。

顺便说一下,我的服务“getAll”调用如下所示:

getAll(page, pagesize) {
    return this.http.get
    (`https://api.someurl.com/${this.ver}/clients?apikey=${this.key}&page=${page}&pagesize=${pagesize}`)
        .map((response: Response) => response.json())
        .catch(this.errorHandler);
}
    errorHandler(error: Response) {
    console.error(error);
    return Observable.throw(error.json().error || 'Server error');
}

我不确定还需要什么才能通过此处的异步管道通过订阅来填充结果。有什么想法我的代码有什么遗漏或错误吗?

【问题讨论】:

    标签: javascript angular observable angular2-observables


    【解决方案1】:

    const records 是一个局部变量。您需要将其设为字段,模板才能访问此变量。

    例如:

    public records: any;
    ngOnInit() {
        this.records = this.clientsService.getAll(1, this.pagesize);
        console.log(this.records);
    }
    

    【讨论】:

    • 试过了,但遇到了几个错误:1.) ";"预期“:”在“this.records”之后的位置 2.)“找不到名称'any'”3.)在“=”的位置,我得到“预期的表达式”
    • @Muirik 比如?
    • 这些错误都出现在我的 IDE - Visual Studio Code 中。
    • 似乎不想让我在这里声明“this.records”。
    • @Muirik 你应该接受 dbandsta 的回答。这个答案给了我在答案下写评论的想法
    【解决方案2】:
    records$: Observable<any>;
    
    ngOnInit() {
      this.records$ = this.clientService.getAll(1, this.pagesize);
    }
    

    在视图中(假设您使用的是 Angular 4+):

    <table *ngIf="records$ | async as records">
      <tr *ngFor="let record of records.data">
    

    【讨论】:

    • 错误:内联模板:27:24 原因:无法读取 null 的属性“数据”
    • @Muirik 怎么样&lt;tr *ngFor="let record of (records$ | async)?.data"&gt;
    • 对不起那个穆里克。我用 Angular4+ 解决方案更新了我的答案。如果您使用的是 Angular 2.x,那么您可以使用 echonax 所说的。
    • 这两个答案的结合帮助我们找到了最终的解决方案。谢谢你们俩。
    猜你喜欢
    • 1970-01-01
    • 2020-11-13
    • 2016-12-25
    • 2019-05-06
    • 2021-10-29
    • 2018-03-04
    • 2021-06-09
    • 2017-02-14
    • 2019-09-11
    相关资源
    最近更新 更多