2016-11-15 45 views
0

如果我嘗試使用RxJS運營商一樣。取,.skip等上FireBaseListObservable,我得到「採取的是不是一個函數」錯誤:如何在FirebaseListObservable上使用.take?

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(); 
    } 
} 

編輯: 通過進口導入。採取「rxjs /添加/運營/取「;沒有工作,但現在我還有一個問題:

爲什麼

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

工作,即使沒有導入走?

我該如何將Observable投射到FirebaseListObservable?

+0

你可以包含你用於'Observable'的'import'語句嗎? – cartant

+0

我已經用示例演員更新了答案(以及我提到的原因)。在'rxjs'中使用'import {Observable};'你已經完整地導入了RxJs。我沒有解釋爲什麼這不會導致'take'(以及所有其他操作符)在AngularFire2可觀察對象中可用。這是一個謎。爲了達到它的底部,你需要包括所有'import'語句和版本等。如果我使用這個導入,我得到所有的操作符。 – cartant

+0

@cartant:現在包含所有導入 –

回答

3

RxJS的分佈方式允許將其全部或小部分導入。

對於要包括take運營商和它的打字稿聲明,你可以選擇將其全部或者進口RxJS:

import * as Rx from "rxjs/Rx"; 

或者可以只輸入您需要的take操作:

import "rxjs/add/operator/take"; 

請注意,AngularFire2可觀察對象實現了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的原因。

+0

感謝您的回答,我現在有更多的問題;)請參閱編輯。 –