2015-12-21 8 views
37

Ich benutze AngularJS 2 Beta 0 und ich versuche, ein RxJS Observable von einem Ereignis auf einem Fensterobjekt zu erstellen. Ich glaube, ich kenne die Formel für die Erfassung der Veranstaltung als beobachtbare in meinem Dienst:Angular2 RxJS bekommen 'Observable_1.Observable.fromEvent ist keine Funktion' Fehler

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

Das Problem ist, dass jedes Mal, wenn ich diesen Code ausführen versuchen, ich erhalte eine Fehlermeldung besagt, dass ‚fromEvent‘ ist keine Funktion.

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

Das scheint mir zu bedeuten, dass ich meine import nicht richtig jetzt Umgang dass RxJS nicht in dem Aufbau von Angular 2 enthalten ist, obwohl der Rest meiner Anwendung richtig funktioniert, mir was bedeutet, dass RxJS ist, wo es sein soll.

Mein Import im Dienst sieht wie folgt aus:

import {Observable} from 'rxjs/Observable'; 

Obwohl ich auch diese zu verwenden, anstatt versucht hat (mit den entsprechenden Änderungen an den Code), mit dem gleichen Ergebnis:

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

ich habe die folgende Konfiguration in meinem Index.HTML:

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

Kann mir jemand sagen, was Ich mache es falsch?

Antwort

66

Das Problem schien zu sein, dass die Import-Anweisung sollte wie folgt aussehen: von rxjs/Rx

import {Observable} from 'rxjs/Rx'; 

Beachten Sie, dass Observable in gebracht wird, anstatt von rxjs/Observable. As @EricMartinez mentions, zieht es auf diese Weise wird automatisch alle Betreiber (wie .map()).

+9

warum fügen wir alles von rxjs hinzu, können wir nicht nur die benötigten teile hinzufügen –

+0

@MahmoudHboubati ja können sie nur die benötigten teile einbringen. Sehen Sie sich die Antwort unten an. Dies ist der richtige Weg, um Dinge zu importieren, damit Sie Ihr Asset-Bundle nicht aufblähen. – SgtPooki

+2

Dies ist keine empfohlene Verwendung .. Sie sollten NIEMALS ALLE Operatoren importieren (also nie von 'rxjs/RX' – Mackelito

76

Es ist definitiv nicht notwendig, alle Operatoren gleichzeitig zu importieren! Sie haben fromEvent falsch importiert. Man könnte es wie folgt tun:

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

EDIT: In addititon zu dem, was ich bereits schrieb: Baumschütteln mit den AoT-Compiler von Winkel entfernt ungenutzten Code, basierend auf was Sie importieren. Wenn Sie nur einige Objekte oder Funktionen aus rxjs/rx importieren, kann der Compiler nichts entfernen. Importieren Sie immer nur, was Sie brauchen!

+3

Beachten Sie, dass Sie die Großbuchstaben eingeben müssen "O" in rxjs/Observable. Ich suchte nach diesem Fehler für immer. –

+2

Das ist die bessere Antwort. Importieren aller Rxjs wird definitiv Ihre Startzeit verlangsamen. – ccnokes

+0

Dies ist definitiv die bessere Lösung, auch wenn @ Michael_Oryl es löst. – seangwright