2015-12-21 31 views
37

Sto utilizzando AngularJS 2 Beta 0 e sto cercando di creare un RxJS Observable da un evento su un oggetto finestra. Credo di sapere la formula per catturare l'evento come un 'osservabile nel mio servizio:Angular2 RxJS ottenendo l'errore 'Observable_1.Observable.fromEvent non è una funzione'

var observ = Observable.fromEvent(this.windowHandle, 'hashchange'); 

Il problema è che ogni volta che cerco eseguire questo codice, ottengo un errore che indica che 'fromEvent' non è una funzione.

Uncaught EXCEPTION: Error during evaluation of "click" 
ORIGINAL EXCEPTION: TypeError: Observable_1.Observable.fromEvent is not a function 

Questo sembra implicare a me che io non sono la manipolazione mia import correttamente ora che RxJS non è inclusa nella build di Angolare 2, anche se il resto delle mie funzioni applicative correttamente, che per me significa che RxJS è dove dovrebbe essere.

mio importazione nel servizio si presenta così:

import {Observable} from 'rxjs/Observable'; 

Anche se ho anche cercato di utilizzare questa invece (con le opportune modifiche al codice), con gli stessi risultati:

import {FromEventObservable} from 'rxjs/observable/fromEvent'; 

ho la seguente configurazione nel mio Index.HTML:

<script> 
    System.config({ 
     map: { 
      rxjs: 'node_modules/rxjs' 
     }, 
     packages: { 
      'app': {defaultExtension: 'js'}, 
      'rxjs': {defaultExtension: 'js'} 
     } 
    }); 
    System.import('app/app'); 
</script> 

qualcuno può dirmi cosa Sto scorrettamente?

risposta

66

Il problema sembrava essere che l'istruzione import dovrebbe essere simile a questo:

import {Observable} from 'rxjs/Rx'; 

noti che Observable viene portato in dal rxjs/Rx invece che da rxjs/Observable. As @EricMartinez mentions, tirandolo in questo modo otterrà automaticamente tutti gli operatori (ad esempio .map()).

+9

perché aggiungiamo tutto da rxjs, non potremmo aggiungere solo le parti necessarie –

+0

@MahmoudHboubati si puoi portare solo le parti necessarie. Vedi la risposta qui sotto .. che è il modo corretto di importare le cose in modo da non ingrossare il tuo patrimonio. – SgtPooki

+2

L'utilizzo non è raccomandato .. NON si deve MAI importare TUTTI gli operatori (quindi non utilizzare mai da 'rxjs/RX' – Mackelito

76

Non è assolutamente necessario importare tutti gli operatori contemporaneamente! Hai appena importato fromEvent sbagliato. Si potrebbe fare così:

import {Observable} from 'rxjs/Observable'; 
import 'rxjs/add/observable/fromEvent'; 

EDIT: In addititon a quello che ho già scritto: albero tremare con AOT-compilatore di angolare rimuove codice inutilizzato, in base a ciò che si importa. Se importi solo alcuni oggetti o funzioni da rxjs/rx, il compilatore non può rimuovere nulla. Importa sempre solo ciò di cui hai bisogno!

+3

Nota che è necessario capitalizzare 'O' in rxjs/Observable.Ho cercato questo errore per sempre –

+2

Questa è la risposta migliore: l'importazione di tutti i rxjs rallenterà sicuramente il tempo di avvio – ccnokes

+0

Questa è sicuramente la soluzione migliore anche se @ Michael_Oryl lo risolve – seangwright

Problemi correlati