【问题标题】:Observables in Angular2Angular2 中的可观察对象
【发布时间】:2017-04-12 01:04:01
【问题描述】:

以下是我的部分 angular2 组件模板 html。 "searchTickets$" 是一个 Observable 对象数组。

<table class="table table-condensed" *ngIf="searchTickets$">
<thead>
    <tr>
        <th><h3>Ticket ID</h3></th>
    </tr>
</thead>
<tbody>
    <tr *ngFor="let ticket of searchTickets$  | async">
        <td><small>{{ticket.ticketID}}</small></td>     
    </tr>
</tbody>
</table>

我的意图是只有当 observable 时才显示表格 返回 1 条或多条记录。

需要在 *ngIf 条件中修改什么来实现这一点。

【问题讨论】:

  • 什么都没有,尝试初始化你的 searchTickets,删除 ngIf,如果数组为空,则不会显示任何内容,搜索后你将该数组设置为响应数据,如果响应有东西,它将呈现该元素
  • 你试过*ngIf="(searchTickets$ | async).length"吗?
  • @ PierreDuc ,是的,它会抛出“Cannot read property 'length' of null”错误。
  • 最初 tit 将是 null ,您需要先像这样进行安全检查: *ngIf="(searchTickets$ | async)?.length"

标签: angular rxjs


【解决方案1】:

你应该试试

<table class="table table-condensed" *ngIf="(searchTickets$ | async)?.length > 0">

【讨论】:

  • searchTickets$ 是一个 observable ,你不能像这样得到它的长度,你首先需要订阅它!
  • 哇,这编辑太棒了。要获取@xe4me 代码,您应该删除您的答案。
  • 我勉强拿了@xe4me 的代码。我的答案来自这里stackoverflow.com/questions/38057537/…
  • 这绝对有效,但问题是您将订阅该来源两次!如果源不会发射太多东西,这不是一个大问题,否则你需要调整源。
  • @xe4me 我做了一个不会触发两次的答案;)
【解决方案2】:

正如@xe4me 所说:

<table class="table table-condensed" *ngIf="(searchTickets$ | async)?.length">

应该可以。

但是

不要忘记 async 正在订阅您的 observable。

这意味着拥有:

<table class="table table-condensed" *ngIf="searchTickets$">

<tr *ngFor="let ticket of searchTickets$  | async">

将导致两个不同的订阅。

如果您在可观察链中的某处进行 HTTP 调用,它将被触发两次。

我猜这不是一个很好的选择。

相反,您应该这样做:


如果您想处理 HTML 中的 observable 而不会因为异步而多次触发 observable

@Component({
  ...
})
export class YourComponent {
  public searchTickets: any;

  constructor(private yourService: any) {
    this.searchTickets = yourService
      .getSearchTicket()
      .share();

    // share allows you to avoid duplicate subscriptions
  }
}

如果您想处理 TS 中的 observable

@Component({
  ...
})
export class YourComponent implements OnDestroy {
  public searchTickets: any;
  private searchTicketsSub: Subscription;

  constructor(private yourService: any) {
    this.searchTickets =
      // let say you have the observable coming from a service that
      // makes an HTTP call 
      yourService
        .getSearchTicket()
        .subscribe((searchTickets: any) => this.searchTickets = searchTickets);
  }

  ngOnDestroy() {
    // then, don't forget to unsubscribe
    this.userSub.unsubscribe();
  }
}

【讨论】:

猜你喜欢
  • 2017-01-29
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-09
  • 2019-01-30
相关资源
最近更新 更多