詳解Angular 中何時取消訂閱
你可能知道當你訂閱 Observable 物件或設定事件監聽時,在某個時間點,你需要執行取消訂閱操作,進而釋放作業系統的記憶體。否則,你的應用程式可能會出現記憶體洩漏。
接下來讓我們看一下,需要在 ngOnDestroy 生命週期鉤子中,手動執行取消訂閱操作的一些常見場景。本文主要介紹了淺談Angular 中何時取消訂閱,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧,希望能幫助大家。
手動釋放資源場景
表單
export class TestComponent { ngOnInit() { this.form = new FormGroup({...}); // 监听表单值的变化 this.valueChanges = this.form.valueChanges.subscribe(console.log); // 监听表单状态的变化 this.statusChanges = this.form.statusChanges.subscribe(console.log); } ngOnDestroy() { this.valueChanges.unsubscribe(); this.statusChanges.unsubscribe(); } }
##
export class TestComponent { constructor(private route: ActivatedRoute, private router: Router) { } 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() { // 手动执行取消订阅的操作 } }
路由
export class TestComponent { constructor( private renderer: Renderer2, private element : ElementRef) { } ngOnInit() { this.click = this.renderer .listen(this.element.nativeElement, "click", handler); } ngOnDestroy() { this.click.unsubscribe(); } }
#Renderer 服務
export class TestComponent { constructor(private element : ElementRef) { } interval: Subscription; click: Subscription; ngOnInit() { this.interval = Observable.interval(1000).subscribe(console.log); this.click = Observable.fromEvent(this.element.nativeElement, 'click') .subscribe(console.log); } ngOnDestroy() { this.interval.unsubscribe(); this.click.unsubscribe(); } }
Infinite Observables
#當你使用interval() 或fromEvent() 運算元時,你建立的是一個無限的Observable 物件。這樣的話,當我們不再需要使用它們的時候,就需要取消訂閱,手動釋放資源。
export class TestComponent { constructor(private store: Store) { } todos: Subscription; ngOnInit() { /** * select(key : string) { * return this.map(state => state[key]).distinctUntilChanged(); * } */ this.todos = this.store.select('todos').subscribe(console.log); } ngOnDestroy() { this.todos.unsubscribe(); } }
@Component({ selector: 'test', template: `<todos [todos]="todos$ | async"></todos>` }) export class TestComponent { constructor(private store: Store) { } ngOnInit() { this.todos$ = this.store.select('todos'); } }
無手動釋放資源場景
@Pipe({name: 'async', pure: false}) export class AsyncPipe implements OnDestroy, PipeTransform { // ... constructor(private _ref: ChangeDetectorRef) {} ngOnDestroy(): void { if (this._subscription) { this._dispose(); } } }
當元件銷毀時,async 管道會自動執行取消訂閱操作,進而避免記憶體外洩的風險。
Angular AsyncPipe 原始碼片段
export class TestDirective { @HostListener('click') onClick() { .... } }
@HostListener
#
// subscribe this.handler = this.renderer.listen('document', "click", event =>{...}); // unsubscribe this.handler();
export class TestComponent { constructor(private http: Http) { } ngOnInit() { // 表示1s后发出值,然后就结束了 Observable.timer(1000).subscribe(console.log); this.http.get('http://api.com').subscribe(console.log); } }
當你使用HTTP 服務或timer Observable 物件時,你也不需要手動執行取消訂閱操作。
// 每隔1秒发出自增的数字,3秒后开始发送 var numbers = Rx.Observable.timer(3000, 1000); numbers.subscribe(x => console.log(x)); // 5秒后发出一个数字 var numbers = Rx.Observable.timer(5000); numbers.subscribe(x => console.log(x));
timer 運算子
運算子簽章
##複製程式碼
timer 回傳一個發出無限自增數列的Observable,有一定的時間間隔,這個間隔由你來選擇。
export class TestComponent { constructor(private store: Store) { } private componetDestroyed: Subject = new Subject(); todos: Subscription; posts: Subscription; ngOnInit() { this.todos = this.store.select('todos') .takeUntil(this.componetDestroyed).subscribe(console.log); this.posts = this.store.select('posts') .takeUntil(this.componetDestroyed).subscribe(console.log); } ngOnDestroy() { this.componetDestroyed.next(); this.componetDestroyed.unsubscribe(); } }
你應該盡可能少的呼叫unsubscribe() 方法,你可以在RxJS: Don't Unsubscribe 這篇文章中了解與Subject 相關更多資訊。
public takeUntil(notifier: Observable): Observable<T>
var interval = Rx.Observable.interval(1000); var clicks = Rx.Observable.fromEvent(document, 'click'); var result = interval.takeUntil(clicks); result.subscribe(x => console.log(x));
以上是詳解Angular 中何時取消訂閱的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

win11預設的窗口重疊非常煩人,因此很多朋友想要取消層疊窗口,但是不知道怎麼取消,其實我們只要用相關軟體就可以了。 win11視窗重疊層疊視窗怎麼取消方法一:透過工作列取消1、win11沒有自帶的取消功能,因此我們需要下載一個「startallback」2、下載完成後,「解壓縮」該壓縮包,解壓縮完成後,打開資料夾,執行圖示安裝程式完成安裝。 。 3.安裝完成後,需要打開“控制台”,然後把右上角“查看方式”改為“大圖標”。 4.這樣就可以在其中找到「startallback」了,點選打開它,進入左邊「任務

用戶在使用美團下單時可以選擇不想要的訂單取消,有很多用戶不知道美團取消訂單怎麼取消,用戶可以在我的頁面中點擊進入訂單待收貨選擇需要取消的訂單點擊取消。美團取消訂單怎麼取消1、先在美團我的頁面中點擊進入訂單待收貨。 2、然後點選進入需要取消的訂單。 3、點選取消訂單。 4、點選確定取消訂單。 5.最後依個人狀況選擇取消原因後點選提交即可。

為了保護螢幕內容或省電我們常常會開啟屏保,但是發現每次屏保退出後都要重新輸入密碼鎖非常麻煩,那麼win11屏幕鎖怎麼取消呢,其實在屏保設置裡就能關閉。 win11螢幕鎖怎麼取消:1、首先我們右鍵桌面空白處,打開「個人化」2、然後在右邊找到並打開「鎖定畫面」3、隨後打開最下面相關設定裡的「螢幕保護程式」4、最後勾選「在恢復時顯示登入畫面」並確定儲存就能取消螢幕鎖了。

1.耳朵符號是語音聽筒模式,首先我們打開微信。 2、點擊右下角的我。 3、點選設定。 4.找到聊天點擊進入。 5.取消勾選使用聽筒播放語音即可。

許多用戶在體驗芒果TV這款影片軟體時,為了享受更多的影視資源和更全面的服務,都會選擇開通會員。而在使用芒果TV會員服務的過程中,部分用戶會選擇開啟自動續費功能享受優惠,以確保不會錯過任何精彩內容。然而,當用戶不再需要會員服務或希望更改付款方式時,取消自動續費功能就是保護財產安全非常重要的一件事,究竟該如何取消芒果tv的自動續費服務呢,想要了解的用戶們就快來跟著本文一起詳細了解吧!芒果tv怎麼取消會員自動續約? 1.先進入芒果tv手機APP裡面的【我的】,再選擇【VIP會員】。 2、然後找到【管

可以在我的黃金VIP會員介面開啟管理自動續費功能進行取消。教學適用型號:華為P50系統:HarmonyOS2.0版本:愛奇藝12.1.0解析1開啟手機上的愛奇藝app,接著進入我的頁面。 2然後在我的頁面點擊上方的黃金VIP會員,接著點擊管理自動續費選項。 3在彈出的視窗中點選取消自動續費,不感興趣,繼續取消。 4最後確認關閉自動續費並點擊我知道了,殘忍拒絕即可。補充:蘋果手機愛奇藝怎麼取消自動續費功能1打開手機上的設置,接著在設定介面點選頂部的【AppleID】。 2在AppleID介面點選【訂閱】選

很多使用win10系統的小伙伴發現,電腦桌面的圖標上有防火牆的標誌,這是什麼情況呢?這讓很多有強迫症的小伙伴特別難受,其實我們只要打開控制面板,在用戶帳戶中的“更改使用者帳號控制設定」變更就可以解決了,具體的教學一起來看看吧。 win10桌面圖示有防火牆標誌怎麼取消1、首先,透過滑鼠右鍵點選電腦開機畫面旁的開始功能表按鈕,然後從彈出的選單中選取控制面板功能。 2.緊接著選擇其中的「使用者帳戶」選項,從接下來出現的新介面中選擇「更改使用者帳戶控制設定」此項目。 3.調整視窗中的滑桿至底部之後,點選確認退出

Angular.js是一種可自由存取的JavaScript平台,用於建立動態應用程式。它允許您透過擴展HTML的語法作為模板語言,以快速、清晰地表示應用程式的各個方面。 Angular.js提供了一系列工具,可協助您編寫、更新和測試程式碼。此外,它還提供了許多功能,如路由和表單管理。本指南將討論在Ubuntu24上安裝Angular的方法。首先,您需要安裝Node.js。 Node.js是一個基於ChromeV8引擎的JavaScript運行環境,可讓您在伺服器端執行JavaScript程式碼。要在Ub
