2016-11-15 2 views
0

Если я пытаюсь использовать RxJS операторы, такие как .Снять, Пропустите и т.д. на FireBaseListObservable, я получаю «взять не является функцией» ошибка:Как использовать .take в FirebaseListObservable?

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

Edit: импортирующие .Снять через импорт «rxjs/добавить/оператор/принять "; сделали работу, хотя теперь у меня есть еще один вопрос:

Почему

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

работает даже без импортируемого взять?

И как я могу отнести наблюдаемый к FirebaseListObservable?

+0

Можете ли вы включить выражение 'import', которое вы использовали для' Observable'? – cartant

+0

Я обновил ответ с помощью примера (и по той причине, о которой я упоминал). При использовании 'import {Observable} из 'rxjs';' вы импортировали RxJs целиком. У меня нет объяснений, почему это не приведет к тому, что '' '(и все остальные операторы) будут доступны на наблюдаемых 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

Спасибо за ваш ответ, у меня теперь больше вопросов;) См. Правки. –

Смежные вопросы