2015-12-20 19 views
7

Ich versuche, einige reactiveX in meinem http-Code zu verwenden. Um dies zu tun, erstelle ich einen Betreff und versuche, die onNext-Funktion aufzurufen, aber ich bekomme eine Fehlermeldung, dass subject.onNext keine Funktion ist.Subject.onNext ist keine Funktion

html:
<input #search (input)="generateSuggestions($event.target.value)">

ts:

import { Jsonp, Response } from 'angular2/http'; 
import { Observable } from 'rxjs/Observable'; 
import { Subject } from 'rxjs/Subject' 
import 'rxjs/add/operator/map'; 
import 'rxjs/add/operator/debounce'; 
import { Injectable } from 'angular2/core'; 

@Injectable() 
export class SearchService { 
    queryStream = new Subject(); 

    generateSuggestions(query: string) { 
     this.queryStream.onNext(query) 
      .debounce(500) 
      .map(
       query => this.jsonp.request(`http://urlendpoint/${query}`) 
         .map((res: Response) => res.json()) 
         .subscribe(results => console.log(results)); 
      ) 
    } 
} 
var queryStream = new Subject(); 

ORIGINAL AUSNAHME: Typeerror: this.queryStream.onNext ist keine Funktion

Alle meine Ebene http Funktionen arbeiten (dies. jsonp.request (URL/Abfrage) .map(). subscribe()), aber der onNext-Operator funktioniert nicht. Ich habe auch Probleme beim Importieren von flatMap, die nicht im gleichen 'rxjs/add/operator/...' Ordner wie map und debunce zu sein scheint.

+5

Das liegt daran, dass 'onNext()' Teil des alten RxJS (RxJS 4) ist, während im neuen RxJS (RxJS 5) die Methode 'next() ' –

+0

WARUM EINE BRECHENDE ÄNDERUNG ??? !! ICH WURDE MEINE HAARE ​​HERAUSZIEHEN ... – koo9

Antwort

10

ersetzen

import { Observable } from 'rxjs/Observable'; 
import { Subject } from 'rxjs/Subject' 
import 'rxjs/add/operator/map'; 
import 'rxjs/add/operator/debounce'; 

mit:

import * as Rx from "rxjs/Rx"; 

und

ersetzen Subject mit Rx.Subject

ersetzen onNext mit next

+0

Danke, das reinigt wirklich die Importe! Für Interessenten gibt es hier das vollständige Migrationsdokument von RxJS 4 zu 5: https://github.com/ReactiveX/RxJS/blob/master/MIGRATION.md – Daynil

+6

Wird das nicht ein bisschen schwer sein (Größe)? weil wir wahrscheinlich alles unnötigerweise von Rx laden? Gemäß dem Hinweis auf https://angular.io/docs/ts/latest/guide/server-communication.html sollten wir nur die Rx-Komponenten/Operatoren laden, die wir benötigen. –