如何在 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
.
的显式导入
如果我尝试在 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
.