我需要在我的项目中执行以下操作(来自 https://github.com/devyumao/angular2-busy)
ngOnInit() {
this.busy = this.http.get('...').subscribe();
}
在我的项目中,我根据路线变化提出以下要求:
ngOnInit(): void {
this.activatedRoute
.params
.map(params => params['queryString'])
.flatMap(id => this.http.(''))
.subscribe(result => this.data = result);
}
似乎每次路线发生变化时我都需要创建一个新的订阅。我不知道该怎么做。
我正在寻找rxjs解决方案(不使用Promise)。
谢谢!
德里克
答案 0 :(得分:4)
我会全局(在您的主要组件中)以这种方式注册路由更改并在相关的回调中触发您的请求:
this.router.events
.filter(event => event instanceof NavigationStart)
// or NavigationEnd
.subscribe(event => {
this.http.post('').subscribe();
});
这样您就可以订阅一次更改。
如果您想要访问路由参数,您还需要注入ActivateRoute实例并订阅其params
属性。
为此,我会利用combineLatest
类的Observable
方法,如下所述:
export class AppComponent {
constructor(private router: Router, private route: ActivatedRoute) {
Observable.combineLatest(
this.router.events
.filter(event => event instanceof NavigationStart),
this.route.params
)
.subscribe(data => {
const event = data[0];
const params = data[1];
(...)
});
}
}
别忘了添加:
import 'rxjs/add/observable/combineLatest';
答案 1 :(得分:2)
实际上,您可以订阅链中的ajaxCallObservable。 :)
ngOnInit(): void {
this.activatedRoute
.params
.map(params => params['queryString'])
.map(id => this.http.(''))
.do(ajaxCallObservable => { this.busy = ajaxCallObservable.subscribe() })
.flatMap(ajaxCallObservable => ajaxCallObservable)
.subscribe(result => this.data = result);
}