AngularJS 2可观察到http变化检测

时间:2017-02-15 10:57:55

标签: angular rxjs angular2-services rxjs5 angular2-http

没有长时间使用Angular2,如果我没有正确理解observable,那么道歉......在一个组件中我订阅了位于服务类中的getData。我想要的是http get调用并在url更改时自动将更改发送回调用者/订阅者(可能还有任何其他URL参数)。怎么能实现这一目标?我可能不能正确理解可观测量吗?

@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;
    }
}

1 个答案:

答案 0 :(得分:4)

通过您的实施,getData()会使用在调用getData()时}保持的任何值。换句话说,如果您在致电this.url后更改this.url,则不会发生任何事情。

要执行您描述的操作,您需要将不同URL的流包装在一个observable中:

getData()

此代码肯定比原始版本更复杂。我已添加评论以澄清,但如果您是RxJS新手,我强烈建议您花一些时间reading the manualwatching some tutorials

您想了解:

  • 不同类型的observable(我使用了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); } } ,这是一种特殊类型的observable,可以发出值并被订阅)。
  • 不同类型的运算符(我使用Subject到&#34;项目&#34;一个observable - URL流 - 到另一个observable - HTTP请求。)