首頁 web前端 js教程 詳解Angular 中何時取消訂閱

詳解Angular 中何時取消訂閱

Dec 12, 2017 am 11:05 AM
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();
 }
}
登入後複製

Redux Store



@Component({
 selector: 'test',
 template: `<todos [todos]="todos$ | async"></todos>`
})
export class TestComponent {
 constructor(private store: Store) { }
 
 ngOnInit() {
   this.todos$ = this.store.select(&#39;todos&#39;);
 }
}
登入後複製


無手動釋放資源場景


AsyncPipe


@Pipe({name: &#39;async&#39;, 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(&#39;click&#39;)
 onClick() {
  ....
 }
}
登入後複製


@HostListener






#

// subscribe
this.handler = this.renderer.listen(&#39;document&#39;, "click", event =>{...});

// unsubscribe
this.handler();
登入後複製


需要注意的是,如果使用@HostListener 裝飾器,新增事件監聽時,我們無法手動取消訂閱。如果需要手動移除事件監聽的話,可以使用以下的方式:


export class TestComponent {
 constructor(private http: Http) { }

 ngOnInit() {
  // 表示1s后发出值,然后就结束了
  Observable.timer(1000).subscribe(console.log);
  this.http.get(&#39;http://api.com&#39;).subscribe(console.log);
 }
}
登入後複製


##Finite Observable


當你使用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 運算子

運算子簽章


##複製程式碼

程式碼如下:


public static timer(initialDelay: number | Date, period: number, scheduler: Scheduler): Observable



運算元作用

timer 回傳一個發出無限自增數列的Observable,有一定的時間間隔,這個間隔由你來選擇。

運算子範例



export class TestComponent {
 constructor(private store: Store) { }

 private componetDestroyed: Subject = new Subject();
 todos: Subscription;
 posts: Subscription;

 ngOnInit() {
   this.todos = this.store.select(&#39;todos&#39;)
           .takeUntil(this.componetDestroyed).subscribe(console.log); 
           
   this.posts = this.store.select(&#39;posts&#39;)
           .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>
登入後複製

####takeUntil 運算子######運算子簽章### ############
var interval = Rx.Observable.interval(1000);
var clicks = Rx.Observable.fromEvent(document, &#39;click&#39;);
var result = interval.takeUntil(clicks);

result.subscribe(x => console.log(x));
登入後複製
############運算子作用#########發出來源Observable 發出的值,直到notifier Observable 發出值。 ######運算子範例###############rrreee############相關推薦:########## ##詳解AngularJS中的表單驗證############詳解AngularJS中自訂指令的使用_AngularJS############詳解AngularJS中自訂篩選器_ AngularJS#######

以上是詳解Angular 中何時取消訂閱的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

如何取消Win11中的視窗疊加與層疊效果 如何取消Win11中的視窗疊加與層疊效果 Jan 10, 2024 pm 02:50 PM

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

美團取消訂單怎麼取消 美團取消訂單怎麼取消 Mar 07, 2024 pm 05:58 PM

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

取消win11螢幕鎖定教學 取消win11螢幕鎖定教學 Dec 31, 2023 pm 12:29 PM

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

微信取消耳朵的符號的詳細步驟 微信取消耳朵的符號的詳細步驟 Mar 25, 2024 pm 05:01 PM

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

芒果tv自動續費在哪取消 芒果tv自動續費在哪取消 Feb 28, 2024 pm 10:16 PM

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

愛奇藝怎麼取消自動續費 愛奇藝取消自動續費怎麼操作 愛奇藝怎麼取消自動續費 愛奇藝取消自動續費怎麼操作 Feb 22, 2024 pm 04:46 PM

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

如何移除Win10桌面圖示上的防火牆標誌? 如何移除Win10桌面圖示上的防火牆標誌? Jan 01, 2024 pm 12:21 PM

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

如何在Ubuntu 24.04上安裝Angular 如何在Ubuntu 24.04上安裝Angular Mar 23, 2024 pm 12:20 PM

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

See all articles