我应该何时存储Subscription实例并unsubscribe()在NgOnDestroy生命周期中调用,何时可以忽略它们?
保存所有订阅会在组件代码中引入很多混乱.
HTTP客户端指南忽略这样的订阅:
getHeroes() {
this.heroService.getHeroes()
.subscribe(
heroes => this.heroes = heroes,
error => this.errorMessage = <any>error);
}
Run Code Online (Sandbox Code Playgroud)
同时," 航线与导航指南"说:
最终,我们会在其他地方导航.路由器将从DOM中删除此组件并将其销毁.在此之前我们需要自己清理.具体来说,我们必须在Angular破坏组件之前取消订阅.如果不这样做可能会造成内存泄漏.
我们取消订阅我们
Observable的ngOnDestroy方法.
private sub: any;
ngOnInit() {
this.sub = this.route.params.subscribe(params => {
let id = +params['id']; // (+) converts string 'id' to a number
this.service.getHero(id).then(hero => this.hero = hero);
});
}
ngOnDestroy() {
this.sub.unsubscribe();
}
Run Code Online (Sandbox Code Playgroud) subscription observable rxjs angular angular-component-life-cycle
您是否需要取消订阅Angular 2 http调用以防止内存泄漏?
fetchFilm(index) {
var sub = this._http.get(`http://example.com`)
.map(result => result.json())
.map(json => {
dispatch(this.receiveFilm(json));
})
.subscribe(e=>sub.unsubscribe());
...
Run Code Online (Sandbox Code Playgroud) 查看angular2代码示例,我们看到一些带有$ sign的公共属性:
<....>
private missionAnnouncedSource = new Subject<string>();
private missionConfirmedSource = new Subject<string>();
// Observable string streams
missionAnnounced$ = this.missionAnnouncedSource.asObservable();
missionConfirmed$ = this.missionConfirmedSource.asObservable();
<....>
Run Code Online (Sandbox Code Playgroud)
谁能解释一下:
在官方风格指南中似乎没有任何相关内容吗?
我需要每 30 秒刷新一次角度组件的数据。我使用简单setInterval:
this.interval = setInterval(() => {
this.refresh(); // api call
}, 10000);
Run Code Online (Sandbox Code Playgroud)
但是,这是不正确的,因为即使我导航到另一个“页面”(在 Angular SPA 中,所有内容都是一页,所以它实际上不是另一页),每 30 秒刷新一次。
仅在特定页面/组件上每 30 秒刷新一次数据的正确方法是什么?
angular ×4
rxjs ×2
angular-component-life-cycle ×1
javascript ×1
memory-leaks ×1
observable ×1
subscription ×1