你可能知道当你订阅可观察到的对象或设置事件监听时,在某个时间点,你需要执行取消订阅操作,进而释放操作系统的内存。否,则你的应用程序可能会出现内存泄露。
接下来让我们看一下,需要在ngOnDestroy生命周期钩子中,手动执行取消订阅操作的一些常见场景。
<强>手动释放资源场景强>
表单
出口类TestComponent { ngOnInit () { 这一点。形式=new FormGroup ({…});//监听表单值的变化 这一点。valueChanges=this.form.valueChanges.subscribe (console.log);//监听表单状态的变化 这一点。statusChanges=this.form.statusChanges.subscribe (console.log); } ngOnDestroy () { this.valueChanges.unsubscribe (); this.statusChanges.unsubscribe (); } } >之前以上方案也适用于其它的表单控件。
路由
出口类TestComponent { 构造函数(私人路线:ActivatedRoute私人路由器:路由器){} ngOnInit () { this.route.params.subscribe (console.log); this.route.queryParams.subscribe (console.log); this.route.fragment.subscribe (console.log); this.route.data.subscribe (console.log); this.route.url.subscribe (console.log); this.router.events.subscribe (console.log); } ngOnDestroy () {//手动执行取消订阅的操作 } } >之前渲染器服务
出口类TestComponent { 构造函数( 私人渲染器:Renderer2, 私人元素:ElementRef) {} ngOnInit () { 这一点。单击=this.renderer .listen (this.element。nativeElement”,点击“处理程序); } ngOnDestroy () { this.click.unsubscribe (); } } >之前无限可见
当你使用时间间隔()或fromEvent()操作符时,你创建的是一个无限的可观察到的对象。这样的话,当我们不再需要使用它们的时候,就需要取消订阅,手动释放资源。
出口类TestComponent { 构造函数(私人元素:ElementRef) {} 间隔:订阅; 点击:订阅; ngOnInit () { this.interval=Observable.interval (1000) .subscribe (console.log); 这一点。点击=Observable.fromEvent (this.element.nativeElement,“点击”) .subscribe (console.log); } ngOnDestroy () { this.interval.unsubscribe (); this.click.unsubscribe (); } } >之前
回来的商店出口类TestComponent { 构造函数(私人存储:存储){} 待办事项:订阅; ngOnInit () {/* * *选择(重点:字符串){ *返回。地图(国家=比;状态(例子)).distinctUntilChanged (); *} */这一点。待办事项=this.store.select(“待办事项”).subscribe (console.log); } ngOnDestroy () { this.todos.unsubscribe (); } } >之前<强>无需手动释放资源场景
强><强> AsyncPipe 强>
@ component ({ 选择器:“测试”, 模板:“& lt;行动计划(待办事项)=" todos $ |异步"祝辞& lt;/todos>” }) 出口类TestComponent { 构造函数(私人存储:存储){} ngOnInit () { 这一点。todos美元=this.store.select(“待办事项”); } }当组件销毁时,异步管道会自动执行取消订阅操作,进而避免内存泄露的风险。
角AsyncPipe源码片段
@Pipe ({name:“异步”,纯:假}) 出口类AsyncPipe实现> 出口类TestDirective { @HostListener(点击)>//订阅 这一点。处理程序=this.renderer。听(“文档”,“点击”,事件=祝辞{…});//退订 this.handler (); >之前<强>有限可观测的强>
当你使用HTTP服务或定时器可观察到的对象时,你也不需要手动执行取消订阅操作。
出口类TestComponent { 构造函数(私人http: http) {} ngOnInit () {//表示1 s后发出值,然后就结束了 Observable.timer (1000) .subscribe (console.log); this.http.get (“http://api.com”) .subscribe (console.log); } }浅谈角中何时取消订阅