欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入理解Angular4訂閱(Subscribe)與取消

 更新時(shí)間:2017年11月22日 10:02:48   作者:微雨燕凝霜寒  
這篇文章主要介紹了深入理解Angular4訂閱(Subscribe)與取消,詳細(xì)的介紹了訂閱與取消的使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

訂閱(Subscribe)

寫過js的都知道,subscribe在很多地方都能看到它的身影,并且起到了很重要的作用。偵聽http請求的返回,頁面間傳遞參數(shù)… …說起訂閱,就不能不提Observable,說起Observable就不能不提Subscribable… …等等,扯太遠(yuǎn)了?;氐秸},subscribe是Observable類下的一個(gè)函數(shù)。從Observable的中文名:”可觀察的”就能看出,Observable的作用是可以起到類似監(jiān)聽的作用,但它的監(jiān)聽往往都是在跨頁面中,舉個(gè)栗子:

// 父頁面
export class SupComponent {
  id: string;
  // 父組件構(gòu)造器
  constructor(private router: Router) {
    // 設(shè)置id
    this.id = 'JvsBRBQHU2BthZQNYrBkVl0Z22zQQIkP';
  }
  // 進(jìn)入詳情頁
  detail(id: string) {
    // 攜帶id跳轉(zhuǎn)至詳細(xì)頁
    this.router.navigate(['sub', id]);
  }
}

// 子頁面
export class SubComponent implements OnInit{
  // 子組件構(gòu)造器
  constructor(private activated: ActivatedRoute) { }
  // 子組件初始化鉤子
  ngOnInit(): void {
    // 訂閱活動路由
    this.activated.params.subscribe(params => {
      console.info(params['id']);
    });
  }
}

以上描述了一個(gè)簡單業(yè)務(wù)的代碼:在列表頁中點(diǎn)擊一個(gè)元素項(xiàng),然后跳轉(zhuǎn)進(jìn)入該元素的詳細(xì)頁,并在詳細(xì)頁中取到該元素的id。這時(shí)候,我們可以看到,訂閱事件派上用場了。

取消訂閱(Unsubscribe)

這時(shí)候我在想,JAVA里面為了內(nèi)存溢出,建議我們讀寫文件的流要關(guān)閉,對象要置空,那訂閱是否要取消呢?在官方文檔上,我們看到一句話:

這里寫圖片描述

那就是說,組件的鉤子會幫我們?nèi)∠嗛?,不需要我們?nèi)∠?。好吧,你說啥就是啥。這天(當(dāng)然就是我寫博客的今天),我遇到了一個(gè)簡單的需求:用戶在‘用戶信息'頁面點(diǎn)擊‘修改資料'按鈕跳轉(zhuǎn)到修改資料的表單頁。當(dāng)然表單的初始信息就是用戶未更改信息前的,這個(gè)沒問題。然后呢,為了盡量少發(fā)無用的請求(沒改動資料也允許用戶提交),我就在DoCheck鉤子里面判斷,如果資料前后不相同就讓按鈕可以點(diǎn)擊,上代碼:

// 修改資料頁面
export class ModifyUerInfo implements OnInit, DoCheck {
  // 用戶實(shí)體
  user: User;
  // 表單組
  form: FormGroup;
  // 聲明訂閱對象
  subscript: Subscription;
  // 修改資料頁構(gòu)造器
  constructor(private builder: FormBuilder) {
    // 實(shí)例化用戶實(shí)體
    this.user = new User();
    // 實(shí)例化訂閱對象
    this.subscript = new Subscription();
  }
  // 修改資料頁初始化鉤子
  ngOnInit(): void {
    // 調(diào)用初始化表單函數(shù)
    this.initForm();
  }
  // 修改資料檢測變動鉤子
  ngDoCheck(): void {
    this.subscript = this.form.valueChanges.subscribe(data => {
      // 若表單無改動,data為null
      if (data == null) {
        // 這里要協(xié)同html進(jìn)行不可點(diǎn)擊操作,比較簡單,就不貼代碼了
        return;
      }
      // 讓提交按鈕可以點(diǎn)擊
      console.info(data);
    })
  }
  // 初始化表單方法
  initForm() {  
    // 初始化表單
    this.form = this.builder.group({
      // 聲明昵稱填寫項(xiàng)(假裝這里有值)
      nickname: [this.user.username, Validators.required],
      // 聲明年齡填寫項(xiàng)(假裝這里有值)
      age: [this.user.age, Validators.required]
    })
  }
}

好了,保存代碼后,當(dāng)我歡喜的去看控制臺結(jié)果的時(shí)候:

這里寫圖片描述

每條紅線,代表我改變了一次表單,請看圖找規(guī)律~找你妹!

可以發(fā)現(xiàn),更改n次表單時(shí),會產(chǎn)生n+1條log,并且是n+1條更改后的表單信息。雖然官方說不需要取消訂閱,但是如果在移動端快速產(chǎn)生那么多訂閱對象,難免保證一定不會沒有問題出現(xiàn),并且作為有理想有追求的程序狗,是無法忍受這種不完美的情況出現(xiàn)的。

于是乎在回調(diào)函數(shù)中,加上了:

// 取消訂閱
this.subscript.unsubscribe();

這里寫圖片描述

這時(shí)候,恢復(fù)理想狀態(tài),搞定收工!

說真的,規(guī)范的代碼不僅僅可以讓代碼的可讀性提高,讓邏輯變得更清楚,讓女神傾慕,讓老板漲工資… …最重要的是可以讓程序避免出可避免的錯(cuò)誤,很多注意點(diǎn)還是要注意的。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

相關(guān)文章

  • Angular.js ng-file-upload結(jié)合springMVC的使用教程

    Angular.js ng-file-upload結(jié)合springMVC的使用教程

    這篇文章主要給大家介紹了關(guān)于Angular.js文件上傳控件ng-file-upload結(jié)合springMVC的使用教程,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-07-07
  • 淺談AngularJS中ng-class的使用方法

    淺談AngularJS中ng-class的使用方法

    下面小編就為大家?guī)硪黄獪\談AngularJS中ng-class的使用方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-11-11
  • 詳解Angular的數(shù)據(jù)顯示優(yōu)化處理

    詳解Angular的數(shù)據(jù)顯示優(yōu)化處理

    本文主要對Angular的數(shù)據(jù)顯示優(yōu)化處理進(jìn)行詳細(xì)介紹,具有一定的參考價(jià)值,下面跟著小編一起來看下吧
    2016-12-12
  • Angular2 http jsonp的實(shí)例詳解

    Angular2 http jsonp的實(shí)例詳解

    這篇文章主要介紹了Angular2 http jsonp的實(shí)例詳解的相關(guān)資料,希望通過本能幫助到大家,需要的朋友可以參考下
    2017-08-08
  • AngularJS刪除路由中的#符號的方法

    AngularJS刪除路由中的#符號的方法

    這篇文章主要介紹了AngularJS刪除路由中的#符號的方法的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09
  • AngularJS Phonecat實(shí)例講解

    AngularJS Phonecat實(shí)例講解

    這篇文章主要為大家詳細(xì)介紹了AngularJS Phonecat實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Angularjs通過指令監(jiān)聽ng-repeat渲染完成后執(zhí)行腳本的方法

    Angularjs通過指令監(jiān)聽ng-repeat渲染完成后執(zhí)行腳本的方法

    指令是angular的核心功能之一,用好了事半功倍,監(jiān)聽ng-repeat執(zhí)行狀態(tài)僅僅是它功能的冰山一角吧。下面這篇文章主要介紹了Angularjs通過指令監(jiān)聽ng-repeat渲染完成后執(zhí)行腳本的方法,需要的朋友可以參考下。
    2016-12-12
  • AngularJS使用攔截器實(shí)現(xiàn)的loading功能完整實(shí)例

    AngularJS使用攔截器實(shí)現(xiàn)的loading功能完整實(shí)例

    這篇文章主要介紹了AngularJS使用攔截器實(shí)現(xiàn)的loading功能,結(jié)合完整實(shí)例形式分析了AngularJS攔截器的設(shè)置、調(diào)用及l(fā)oading功能實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-05-05
  • 使用Angular 6創(chuàng)建各種動畫效果的方法

    使用Angular 6創(chuàng)建各種動畫效果的方法

    Angular能夠讓我們創(chuàng)建出具有原生表現(xiàn)效果的動畫。我們將通過本文學(xué)習(xí)到如何使用Angular 6來創(chuàng)建各種動畫效果。在此,我們將使用Visual Studio Code來進(jìn)行示例演示。感興趣的朋友跟隨小編一起看看吧
    2018-10-10
  • AngularJS 遇到的小坑與技巧小結(jié)

    AngularJS 遇到的小坑與技巧小結(jié)

    本文主要對AngularJS 遇到的小坑與技巧進(jìn)行了一個(gè)小小的總結(jié),比較使用,希望能給大家做一個(gè)參考。
    2016-06-06

最新評論