分享更有价值
被信任是一种快乐

Angular变更检测中的订阅异步事件怎么实现

文章页正文上

今天小编给大家分享一下Angular变更检测中的订阅异步事件怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。只要发生了异步操作,Angular就后进行变更检测,那么Angular是如何订阅(感知)到异步事件的呢?也就是说,当异步事件执行的时候,Angular是怎么知道的呢?先来了解一下zone.js。zone.js 提供了一种称为zone的机制,用于封装和拦截浏览器中的异步任务,还提供了异步生命周期钩子和统一的异步错误处理机制。zone.js是通过打补丁的方式来对浏览器中常见免费云主机、域名方法和元素进行拦截,比如setTimeoutHTMLElement.prototype.onclick。Angular在启动时会利用zone.js修补几个浏览器API,从而去实现异步事件的捕获,并在捕获事件后调用变更检测。package.json如下示例:

{
"dependencies":{
...
"zone.js":"~0.10.2"
}
}

可以简单来看一下zone.js。比如,在Vue2中的数据响应式,我们都知道它是使用了Object.defineProperty来实现数据变化的拦截,但是它存在很多问题,它只可以监听对象的属性变化,但是对于数组的变化时无能为力的。数组原型中有7个方法可以引起数组的变化,对于这些方法Vue都需要感知到他们,那怎么实现呢?拿push方法作为例子,需要把原始的push方法覆盖掉,实现一个新的push,新的push方法要保留原始push方法的功能,还要通知依赖进行更新。zone.js中的实现和这个思路是一样的,来看一段简化的代码模拟一下setTimeout的补丁过程:

functionsetTimeoutPatch(){
//存储原始的setTimeout
varoriginSetTimeout=window['setTimeout'];
//对浏览器原生方法的包裹封装
window.setTimeout=function(){
returnglobal['zone']['setTimeout'].apply(global.zone,arguments);
};
//创建包裹方法,提供给上面重写后的setTimeout使用
Zone.prototype['setTimeout']=function(fn,delay){
//先调用原始方法
originSetTimeout.apply(window,arguments);
//执行完原始方法后就可以做其他拦截后需要进行的操作了
...
};
}

以上就是“Angular变更检测中的订阅异步事件怎么实现”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注云技术行业资讯频道。

相关推荐: 用vue做的网页怎么打开

本篇内容主要讲解“用vue做的网页怎么打开”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“用vue做的网页怎么打开”吧! Vue是一款流行的JavaScript框架,用于构建现代的web应用程序。Vue的主要优点是它…

文章页内容下
赞(0) 打赏
版权声明:本站采用知识共享、学习交流,不允许用于商业用途;文章由发布者自行承担一切责任,与本站无关。
文章页正文下
文章页评论上

云服务器、web空间可免费试用

宝塔面板主机、支持php,mysql等,SSL部署;安全高速企业专供99.999%稳定,另有高防主机、不限制内容等类型,具体可咨询QQ:360163164,Tel同微信:18905205712

主机选购导航云服务器试用

登录

找回密码

注册