如果我尝试在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?
答案 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
的显式导入的原因。