如何在 FirebaseListObservable 上使用 .take?

How do I use .take on FirebaseListObservable?

如果我尝试在 FireBaseListObservable 上使用 .take、.skip 等 RxJS 运算符,我会收到 "take is not a function" 错误:

import {Component} from '@angular/core';
import {AngularFire, FirebaseListObservable} from 'angularfire2';
import {Observable} from 'rxjs';

export class AppComponent {
  items: FirebaseListObservable<any>;

  constructor(public af: AngularFire) {
    // this works
    Observable.interval(1000).take(5).subscribe(x => console.log(x));

    this.items = af.database.list('/items');
    // this does not
    this.items.take(1).subscribe();
  }
}

编辑: 通过 import "rxjs/add/operator/take" 导入 .take;确实有效,但现在我有另一个问题:

为什么

Observable.interval(1000).take(5).subscribe(x => console.log(x));

即使不导入镜头也能工作吗?

以及如何将 Observable 转换为 FirebaseListObservable?

RxJS 的分发方式允许其整体或小块导入。

要包含 take 运算符及其 TypeScript 声明,您可以选择完全导入 RxJS:

import * as Rx from "rxjs/Rx";

或者可以仅导入您需要的 take 运算符:

import "rxjs/add/operator/take";

请注意,AngularFire2 observables 实现 lift 用于与运算符组合。这样做的效果是,在您使用运算符后,类型将是 Observable<T> 而不是 FirebaseListObservable<T>,因此如果您将组合的可观察对象分配给 FirebaseListObservable<T> 变量或 属性 你需要演员表。

例如:

let item = af.database.list('/items').take(1) as FirebaseListObservable<any>;

但是,只有当您打算将变量用作 FirebaseListObservable(它有其他方法)时才需要这样做。通常,您会将其保留为 Observable。 (我提到这个是因为你有一个 FirebaseListObservable<any> 类型的 属性 并且我已经看到这会导致许多其他问题的混淆。)

关于您在针对该问题的评论中提到的错误,导入之间的相互作用很重要。如果您像这样导入 Observable

import { Observable } from "rxjs";

您将完整地包含 RxJS,并且在编写 FirebaseListObservable 个实例时所有运算符都应该可用。

但是,如果导入的 Observable 未在导入它的模块中的任何地方使用,它将忽略,你不会得到任何进口的东西。这可能就是为什么您需要 take.

的显式导入