深入理解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 相关文章推荐
Ajax一统天下之Dojo整合篇
Mar 24 Javascript
JQuery 学习笔记 选择器之一
Jul 23 Javascript
jsp+javascript打造级连菜单的实例代码
Jun 14 Javascript
node.js中的fs.existsSync方法使用说明
Dec 17 Javascript
jQuery对象与DOM对象之间的相互转换
Mar 03 Javascript
javascript限制文本框输入值类型的方法
May 07 Javascript
JavaScript判断数字是否为质数的方法汇总
Jun 02 Javascript
JavaScrpt中如何使用 cookie 设置查看与删除功能
Jul 09 Javascript
Node使用Sequlize连接Mysql报错:Access denied for user ‘xxx’@‘localhost’
Jan 03 Javascript
使用vue-router设置每个页面的title方法
Feb 11 Javascript
vuex提交state&&实时监听state数据的改变方法
Sep 16 Javascript
使用element-ui table expand展开行实现手风琴效果
Mar 15 Javascript
利用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文本操作类
2006/11/25 PHP
PHPAnalysis中文分词类详解
2014/06/13 PHP
php页面函数设置超时限制的方法
2014/12/01 PHP
php版微信公众平台接口参数调试实现判断用户行为的方法
2016/09/23 PHP
thinkPHP订单数字提醒功能的实现方法
2016/12/01 PHP
Laravel中任务调度console使用方法小结
2017/05/07 PHP
PHP使用Redis长连接的方法详解
2018/02/12 PHP
Javascript客户端脚本的设计和应用
2006/08/21 Javascript
jBox 2.3基于jquery的最新多功能对话框插件 常见使用问题解答
2011/11/10 Javascript
如何让页面加载完成后执行js
2013/06/26 Javascript
判断window.onload是否多次使用的方法
2014/09/21 Javascript
js使用心得分享
2015/01/13 Javascript
Nodejs为什么选择javascript为载体语言
2015/01/13 NodeJs
AngularJS学习笔记之依赖注入详解
2016/05/16 Javascript
VueJs单页应用实现微信网页授权及微信分享功能示例
2017/07/26 Javascript
Vue中使用Sortable的示例代码
2018/04/07 Javascript
vue操作动画的记录animate.css实例代码
2019/04/26 Javascript
angular inputNumber指令输入框只能输入数字的实现
2019/12/03 Javascript
Nodejs封装类似express框架的路由实例详解
2020/01/05 NodeJs
Python模拟随机游走图形效果示例
2018/02/06 Python
PyQt5实现从主窗口打开子窗口的方法
2019/06/19 Python
Pycharm 文件更改目录后,执行路径未更新的解决方法
2019/07/19 Python
Django 用户认证组件使用详解
2019/07/23 Python
pytorch中使用cuda扩展的实现示例
2020/02/12 Python
ubuntu 安装pyqt5和卸载pyQt5的方法
2020/03/24 Python
css3中检验表单的required,focus,valid和invalid样式
2014/02/21 HTML / CSS
详解canvas绘图时遇到的跨域问题
2018/03/22 HTML / CSS
linux面试相关问题
2013/04/28 面试题
传播学专业毕业生自荐信
2013/11/04 职场文书
搞笑创意广告语
2014/03/17 职场文书
《骑牛比赛》教后反思
2014/04/22 职场文书
毕业班班主任工作总结2015
2015/07/23 职场文书
2016年10月份红领巾广播稿
2015/12/21 职场文书
PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤
2021/05/21 PostgreSQL
Keras多线程机制与flask多线程冲突的解决方案
2021/05/28 Python
Python获取江苏疫情实时数据及爬虫分析
2021/08/02 Python