2016-11-22 20 views
11

Ich habe schon immer gewusst, dass ich meine Observable Operatoren separat importiere, um die Ladezeiten zu begrenzen. Allerdings habe ich heute etwas bemerkt, dass mir hoffentlich jemand erklären könnte.Angular und RxJS Importe

Ich verwende IntelliJ/WebStorm mit Webpack.

Lassen Sie uns auf eine Seite sagen, in meinem ngOnInit ich einen http-Anruf:

ngOnInit() { 
     this.http.get('https//:google.com').map(e => e); 
} 

Wenn ich der Compiler die Karte Betreiber nicht importieren wird sich beschweren, so dass ich importieren Sie es wie folgt aus:

import 'rxjs/add/operator/map'; 

Alles ist gut in der Welt. Bis ich ein Observable verwenden muss. Also, ich werde eins hinzufügen.

ngOnInit() { 
     let test = Observable.create(subscriber => { 
      return null; 
     }); 

     this.http.get('https//:google.com').map(e => e); 
} 

Jetzt ist der Compiler beschwert mich verständlicherweise, dass es nicht beobachtbare finden, so dass ich IntelliJ/WebStorm es für mich zu importieren und fügt diese an der Spitze meiner Datei:

import {Observable} from 'rxjs'; 

Alles wieder gut . Aber dieser neue Import scheint den Import der Karte irrelevant zu machen. Was ich meine ist, dass, wenn ich die Karte Import entfernen und nur die beobachtbaren man in verlassen, alle kompiliert fein ...

aber wenn ich so beobachtbare importieren angeben:

import {Observable} from 'rxjs/Observable'; 

Dann habe ich muss den Import für den Kartenoperator erneut hinzufügen ...

Ich importiere alle RxJS, wenn ich mein Observable wie folgt importiere?

Wenn ja, wie kann ich IntelliJ sagen, dies nicht zu tun und Klasse zu importieren?

+0

Das ist richtig. Wenn Sie 'Observable' von' rxjs' importieren, importieren Sie ** alle ** rxjs-Operatoren und -Funktionen (wo unter map), was ziemlich schlecht ist, da es die Dateigröße erhöht. Ich habe keine Ahnung, wenn Sie InteliJ spezifischer für die Autoimporte sein können. – tjoskar

+0

'Import {Observable} von 'rxjs' importiert' Rx.d.ts' (schau dir den Inhalt an;)) was ** alles ** ist. Sie müssen es wie folgt importieren: '{Observable} von 'rxjs/Observable' importieren;'. Das Problem ist nicht das, was Sie in Ihren Bereich "importieren" (zwischen den geschweiften Klammern), sondern die Datei und rekursiv alles, was viel Zeit in Anspruch nimmt, die wir nicht wollen. – Aitch

+0

Dank Tjoskar und Aitch, das ist jetzt klar. – Thibs

Antwort

13

Warum haben Sie nicht eine Datei (zB: rxjs-extensions.ts) mit Ihren erforderlichen rxjs beobachtbaren Klassenerweiterungen und Operatoren?

// Observable class extensions 
import 'rxjs/add/observable/throw'; 

// Observable operators 
import 'rxjs/add/operator/do'; 
import 'rxjs/add/operator/filter'; 
import 'rxjs/add/operator/map'; 

Und dann in Ihrem Hauptmodul (ex app.module.ts) Import aus dieser Datei:

import './rxjs-extensions'; 

Und in der Hauptkomponente (ex: app.component.ts) importieren nur Observavle :

import { Observable } from 'rxjs/Rx'; 

Dies ist, wie es auf dem Hauptwinkel tutorial behandelt wird.

+1

Ich habe in meiner Frage nicht erwähnt, dass ich das versucht habe. Also, obwohl es jemand anderem helfen konnte, hatte ich das schon einmal gemacht. Mir war nur nicht klar ob der ... von 'rxjs'; importiert das ganze Ding, das ist stellt sich heraus, es tut .. Danke für Ihre Antwort obwohl – Thibs

-1

Sie können alle Operatoren durch diese Verwendung:

import * as Rx from "rxjs/Rx"; 

Rx.Observable.of(1,2,3,4,5); 
+0

wie in der eckigen Dokumentation erwähnt: https://angular.io/guide/http#enable-rxjs-operators, um die Größe so klein zu halten möglich, sollten Sie nur importieren, was Sie verwenden. – TekTimmy

1

ab WebStorm 2016,3 (glaube ich), haben Sie die Möglichkeit, bestimmte Einfuhren auf die schwarze Liste.Editor > Code Style > StypeScript

Do not import exactly from: [rxjs] 

Zusätzlich gibt es ein Flag in tslint globalen Importe zu verbieten:

{ 
    "rules": { 
    "import-blacklist": [true, "rxjs"] 
    } 
}