深入理解Angular4订阅(Subscribe)与取消


Posted in Javascript onNovember 22, 2017

订阅(Subscribe)

写过js的都知道,subscribe在很多地方都能看到它的身影,并且起到了很重要的作用。侦听http请求的返回,页面间传递参数… …说起订阅,就不能不提Observable,说起Observable就不能不提Subscribable… …等等,扯太远了。回到正题,subscribe是Observable类下的一个函数。从Observable的中文名:”可观察的”就能看出,Observable的作用是可以起到类似监听的作用,但它的监听往往都是在跨页面中,举个栗子:

// 父页面
export class SupComponent {
  id: string;
  // 父组件构造器
  constructor(private router: Router) {
    // 设置id
    this.id = 'JvsBRBQHU2BthZQNYrBkVl0Z22zQQIkP';
  }
  // 进入详情页
  detail(id: string) {
    // 携带id跳转至详细页
    this.router.navigate(['sub', id]);
  }
}

// 子页面
export class SubComponent implements OnInit{
  // 子组件构造器
  constructor(private activated: ActivatedRoute) { }
  // 子组件初始化钩子
  ngOnInit(): void {
    // 订阅活动路由
    this.activated.params.subscribe(params => {
      console.info(params['id']);
    });
  }
}

以上描述了一个简单业务的代码:在列表页中点击一个元素项,然后跳转进入该元素的详细页,并在详细页中取到该元素的id。这时候,我们可以看到,订阅事件派上用场了。

取消订阅(Unsubscribe)

这时候我在想,JAVA里面为了内存溢出,建议我们读写文件的流要关闭,对象要置空,那订阅是否要取消呢?在官方文档上,我们看到一句话:

深入理解Angular4订阅(Subscribe)与取消

那就是说,组件的钩子会帮我们取消订阅,不需要我们取消。好吧,你说啥就是啥。这天(当然就是我写博客的今天),我遇到了一个简单的需求:用户在‘用户信息'页面点击‘修改资料'按钮跳转到修改资料的表单页。当然表单的初始信息就是用户未更改信息前的,这个没问题。然后呢,为了尽量少发无用的请求(没改动资料也允许用户提交),我就在DoCheck钩子里面判断,如果资料前后不相同就让按钮可以点击,上代码:

// 修改资料页面
export class ModifyUerInfo implements OnInit, DoCheck {
  // 用户实体
  user: User;
  // 表单组
  form: FormGroup;
  // 声明订阅对象
  subscript: Subscription;
  // 修改资料页构造器
  constructor(private builder: FormBuilder) {
    // 实例化用户实体
    this.user = new User();
    // 实例化订阅对象
    this.subscript = new Subscription();
  }
  // 修改资料页初始化钩子
  ngOnInit(): void {
    // 调用初始化表单函数
    this.initForm();
  }
  // 修改资料检测变动钩子
  ngDoCheck(): void {
    this.subscript = this.form.valueChanges.subscribe(data => {
      // 若表单无改动,data为null
      if (data == null) {
        // 这里要协同html进行不可点击操作,比较简单,就不贴代码了
        return;
      }
      // 让提交按钮可以点击
      console.info(data);
    })
  }
  // 初始化表单方法
  initForm() {  
    // 初始化表单
    this.form = this.builder.group({
      // 声明昵称填写项(假装这里有值)
      nickname: [this.user.username, Validators.required],
      // 声明年龄填写项(假装这里有值)
      age: [this.user.age, Validators.required]
    })
  }
}

好了,保存代码后,当我欢喜的去看控制台结果的时候:

深入理解Angular4订阅(Subscribe)与取消

每条红线,代表我改变了一次表单,请看图找规律~找你妹!

可以发现,更改n次表单时,会产生n+1条log,并且是n+1条更改后的表单信息。虽然官方说不需要取消订阅,但是如果在移动端快速产生那么多订阅对象,难免保证一定不会没有问题出现,并且作为有理想有追求的程序狗,是无法忍受这种不完美的情况出现的。

于是乎在回调函数中,加上了:

// 取消订阅
this.subscript.unsubscribe();

深入理解Angular4订阅(Subscribe)与取消

这时候,恢复理想状态,搞定收工!

说真的,规范的代码不仅仅可以让代码的可读性提高,让逻辑变得更清楚,让女神倾慕,让老板涨工资… …最重要的是可以让程序避免出可避免的错误,很多注意点还是要注意的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
SharePoint 客户端对象模型 (一) ECMA Script
May 22 Javascript
jquery ajax对特殊字符进行转义防止js注入使用示例
Nov 21 Javascript
在myeclipse中如何加入jquery代码提示功能
Jun 03 Javascript
jquery图片播放浏览插件prettyPhoto使用详解
Dec 19 Javascript
jQuery验证插件validation使用指南
Apr 21 Javascript
Jquery常用的方法汇总
Sep 01 Javascript
BootStrap selectpicker后台动态绑定数据
Jun 01 Javascript
webpack4.x下babel的安装、配置及使用详解
Mar 07 Javascript
java实现单链表增删改查的实例代码详解
Aug 30 Javascript
JavaScript实现飞舞的泡泡效果
Feb 07 Javascript
vue swipeCell滑动单元格(仿微信)的实现示例
Sep 14 Javascript
vue router 动态路由清除方式
May 25 Vue.js
利用vue + koa2 + mockjs模拟数据的方法教程
Nov 22 #Javascript
详解从零搭建 vue2 vue-router2 webpack3 工程
Nov 22 #Javascript
利用vue+elementUI实现部分引入组件的方法详解
Nov 22 #Javascript
通过一个简单的例子学会vuex与模块化
Nov 22 #Javascript
第一个Vue插件从封装到发布
Nov 22 #Javascript
详细分析单线程JS执行问题
Nov 22 #Javascript
jquery实现回车键触发事件(实例讲解)
Nov 21 #jQuery
You might like
PHP使用GIFEncoder类处理gif图片实例
2014/07/01 PHP
php+mysql删除指定编号员工信息的方法
2015/01/14 PHP
Android AsyncTack 异步任务实例详解
2016/11/02 PHP
jquery 实现的全选和反选
2009/04/15 Javascript
jQuery帮助之筛选查找 children([expr])
2011/01/31 Javascript
js中字符替换函数String.replace()使用技巧
2011/08/14 Javascript
当jQuery遭遇CoffeeScript的时候 使用分享
2011/09/17 Javascript
nodejs教程 安装express及配置app.js文件的详细步骤
2013/05/11 NodeJs
javascript与jquery中跳出循环的区别总结
2013/11/04 Javascript
JavaScript sub方法入门实例(把字符串显示为下标)
2014/10/17 Javascript
NodeJS学习笔记之Connect中间件模块(一)
2015/01/27 NodeJs
深入理解JavaScript系列(26):设计模式之构造函数模式详解
2015/03/03 Javascript
JavaScript给url网址进行encode编码的方法
2015/03/18 Javascript
基于jQuery实现发送短信验证码后的倒计时功能(无视页面关闭)
2016/09/02 Javascript
微信小程序实现给循环列表添加点击样式实例
2017/04/26 Javascript
在vue中封装可复用的组件方法
2018/03/01 Javascript
详解Ant Design of React的安装和使用方法
2018/12/27 Javascript
turn.js异步加载实现翻书效果
2019/07/25 Javascript
JavaScript读取本地文件常用方法流程解析
2020/10/12 Javascript
五句话帮你轻松搞定js原型链
2020/12/09 Javascript
[51:36]EG vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
Python对列表排序的方法实例分析
2015/05/16 Python
Python实现批量将word转html并将html内容发布至网站的方法
2015/07/14 Python
python中字符串类型json操作的注意事项
2017/05/02 Python
Python自动化运维_文件内容差异对比分析
2017/12/13 Python
python: line=f.readlines()消除line中\n的方法
2018/03/19 Python
python:print格式化输出到文件的实例
2018/05/14 Python
python之cv2与图像的载入、显示和保存实例
2018/12/05 Python
基于Python数据分析之pandas统计分析
2020/03/03 Python
PyQT5 实现快捷键复制表格数据的方法示例
2020/06/19 Python
python使用正则表达式匹配txt特定字符串(有换行)
2020/12/09 Python
浅谈matplotlib默认字体设置探索
2021/02/03 Python
canvas需要在标签里直接定义宽高
2014/12/17 HTML / CSS
英国工作场所设备购买网站:Slingsby
2019/05/03 全球购物
民政局2016年“六一”儿童节慰问活动总结
2016/04/06 职场文书
简单介绍 http请求响应参数、无连接无状态、MIME、状态码、端口、telnet、curl
2021/03/31 HTML / CSS