2017-02-15 5 views
0

Nicht lange genug Angular2, so entschuldigt, wenn ich Observables nicht richtig verstehe ... in einer Komponente Ich abonniere getData, die in einer Serviceklasse sitzt. Was ich will ist, dass der http-Aufruf automatisch Änderungen an den Anrufer/Abonnenten zurücksendet, wenn sich die URL ändert (und vielleicht andere URL-Parameter für diese Angelegenheit). Wie kann dies erreicht werden? Versteh ich Observables vielleicht nicht richtig?AngularJS 2 Observable http Änderungserkennung

@Injectable() 
export class HttpService { 

    url: string; 

    constructor(
     private http: Http 
    ) {} 

    getData() { 
     return this.http.get(`${this.url}`) 
      .map((res:Response) => res.json()); 
    } 

    setUrl(url) { 
     this.url = url; 
    } 
} 

Antwort

4

Mit Ihrer Implementierung getData() Anwendungen, was auch immer Wert this.urlzum Zeitpunkt hält getData() wird aufgerufen. Mit anderen Worten, wenn Sie this.url ändern, nachdem Sie getData() aufgerufen haben, wird nichts passieren.

zu tun, was Sie beschreiben, müssen Sie den Strom von verschiedenen URLs innerhalb einer beobachtbaren einzuwickeln:

import {Subject} from 'rxjs/Subject'; 

@Injectable() 
export class HttpService { 
    // The `url` property is replaced with an observable emitting a stream of URLs. 
    private _urlsStream: Subject<string> = new Subject<string>(); 

    constructor(private http: Http) {} 

    // The http.get() now gets its urls from the url stream. 
    // Every time a new url is pushed to the stream, a new request is executed. 
    getData() { 
    return this._urlsStream.asObservable() 
     .mergeMap((url: string) => this.http.get(url)) 
     .map((res: Response) => res.json()); 
    } 

    setUrl(url) { 
    // Setting an url pushes the given url to the stream. 
    this._urlsStream.next(url); 
    } 
} 

Dieser Code als die ursprüngliche Version auf jeden Fall mehr beteiligt ist. Ich habe Kommentare hinzugefügt, um zu klären, aber wenn Sie neu bei RxJS sind, schlage ich vor, dass Sie einige Zeit mit reading the manual und watching some tutorials verbringen.

Sie werden darüber erfahren möchten:

  • die verschiedenen Arten von Observablen (I verwendet, um eine Subject, die eine besondere Art der zu beobachten ist, dass beide Werte emittieren können und abonniert werden).
  • Die verschiedenen Arten von Operatoren (ich verwendete mergeMap() zu "projizieren" eine beobachtbare - der Strom von URLs - in eine andere beobachtbare - die HTTP-Anfragen).
Verwandte Themen