深入理解Angular4訂閱(Subscribe)與取消
訂閱(Subscribe)
寫過js的都知道,subscribe在很多地方都能看到它的身影,并且起到了很重要的作用。偵聽http請(qǐng)求的返回,頁面間傳遞參數(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 {
// 訂閱活動(dòng)路由
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)閉,對(duì)象要置空,那訂閱是否要取消呢?在官方文檔上,我們看到一句話:

那就是說,組件的鉤子會(huì)幫我們?nèi)∠嗛?,不需要我們?nèi)∠?。好吧,你說啥就是啥。這天(當(dāng)然就是我寫博客的今天),我遇到了一個(gè)簡單的需求:用戶在‘用戶信息'頁面點(diǎn)擊‘修改資料'按鈕跳轉(zhuǎn)到修改資料的表單頁。當(dāng)然表單的初始信息就是用戶未更改信息前的,這個(gè)沒問題。然后呢,為了盡量少發(fā)無用的請(qǐng)求(沒改動(dòng)資料也允許用戶提交),我就在DoCheck鉤子里面判斷,如果資料前后不相同就讓按鈕可以點(diǎn)擊,上代碼:
// 修改資料頁面
export class ModifyUerInfo implements OnInit, DoCheck {
// 用戶實(shí)體
user: User;
// 表單組
form: FormGroup;
// 聲明訂閱對(duì)象
subscript: Subscription;
// 修改資料頁構(gòu)造器
constructor(private builder: FormBuilder) {
// 實(shí)例化用戶實(shí)體
this.user = new User();
// 實(shí)例化訂閱對(duì)象
this.subscript = new Subscription();
}
// 修改資料頁初始化鉤子
ngOnInit(): void {
// 調(diào)用初始化表單函數(shù)
this.initForm();
}
// 修改資料檢測(cè)變動(dòng)鉤子
ngDoCheck(): void {
this.subscript = this.form.valueChanges.subscribe(data => {
// 若表單無改動(dòng),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)我歡喜的去看控制臺(tái)結(jié)果的時(shí)候:

每條紅線,代表我改變了一次表單,請(qǐng)看圖找規(guī)律~找你妹!
可以發(fā)現(xiàn),更改n次表單時(shí),會(huì)產(chǎn)生n+1條log,并且是n+1條更改后的表單信息。雖然官方說不需要取消訂閱,但是如果在移動(dòng)端快速產(chǎn)生那么多訂閱對(duì)象,難免保證一定不會(huì)沒有問題出現(xiàn),并且作為有理想有追求的程序狗,是無法忍受這種不完美的情況出現(xiàn)的。
于是乎在回調(diào)函數(shù)中,加上了:
// 取消訂閱 this.subscript.unsubscribe();

這時(shí)候,恢復(fù)理想狀態(tài),搞定收工!
說真的,規(guī)范的代碼不僅僅可以讓代碼的可讀性提高,讓邏輯變得更清楚,讓女神傾慕,讓老板漲工資… …最重要的是可以讓程序避免出可避免的錯(cuò)誤,很多注意點(diǎn)還是要注意的。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Angular中ng-bind和ng-model的區(qū)別實(shí)例詳解
這篇文章主要介紹了Angular中ng-bind和ng-model的區(qū)別實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04
在 Angular6 中使用 HTTP 請(qǐng)求服務(wù)端數(shù)據(jù)的步驟詳解
本文分步驟給大家介紹了在 Angular6 中使用 HTTP 請(qǐng)求服務(wù)端數(shù)據(jù)的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08
angular4中*ngFor不能對(duì)返回來的對(duì)象進(jìn)行循環(huán)的解決方法
今天小編就為大家分享一篇angular4中*ngFor不能對(duì)返回來的對(duì)象進(jìn)行循環(huán)的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-09-09
Angularjs 實(shí)現(xiàn)動(dòng)態(tài)添加控件功能
這篇文章主要介紹了Angularjs 實(shí)現(xiàn)動(dòng)態(tài)添加控件功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-05-05
AngularJS內(nèi)建服務(wù)$location及其功能詳解
這篇文章主要為大家詳細(xì)介紹了AngularJS內(nèi)建服務(wù)$location及$location功能,感興趣的小伙伴們可以參考一下2016-07-07
swiper在angularjs中使用循環(huán)輪播失效的解決方法
今天小編就為大家分享一篇swiper在angularjs中使用循環(huán)輪播失效的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-09-09
AngularJs定制樣式插入到ueditor中的問題小結(jié)
這篇文章主要介紹了AngularJs定制樣式插入到ueditor中的問題小結(jié)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08

