如何在FirebaseListObservable上使用.take?

时间:2016-11-15 22:40:35

标签: rxjs angularfire2

如果我尝试在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?

1 个答案:

答案 0 :(得分:3)

RxJS的分发方式允许它全部或小部分导入。

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

import * as Rx from "rxjs/Rx";

或者只能导入您需要的take运算符:

import "rxjs/add/operator/take";

请注意,AngularFire2 observable实现了lift与运算符的组合。这样做的结果是,在使用运算符后,类型将是Observable<T>而不是FirebaseListObservable<T>,因此如果要将组合的observable分配给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的显式导入的原因。