本文主要介绍角脏检测机制原理(角脏检测),下面一起看看角脏检测机制原理(角脏检测)相关资讯。
|||浏览器事件周期和mvw的角度
肮脏的检查和是angular中的核心机制之一,是实现双向绑定和mvvm模式的重要基础。
angular将双向绑定转换成一堆watch表达式,然后递归检查这些watch表达式的结果是否发生了变化,如果是,则执行相应的watchdog函数。当model的值不再改变时,将不再触发观察器函数,一个完整的摘要循环将结束。
因为我们可以在不改变编程思维的情况下,用相同的语言和相同的事件模型快速开发nodejs程序,nodejs很快流行起来,javascript全栈也越来越流行。
我们经常听到angular是mv*的一个框架,因为angular扩展了浏览器的事件模型,建立了自己的上下文环境。
|| $手表功能| |角度
观察表达式是灵活的:它可以是一个函数,一个$scope上的属性名,或者一个字符串形式的表达式。$scope上的属性名或表达式最终将被$parse服务解析为一个响应函数来获取属性值。
所有的观察函数都将入到作用域的头部。$$watchers数组由unshift函数调用,以便它可以被下面的$digest使用。
最后,$watch函数将返回一个unregister函数,一旦我们调用它,我们就可以删除已注册的watcher。
需要注意的是,angular默认不使用angular.equals函数进行深度比较,因为用= =比较更快,所以在比较数组或对象时会检查引用。这就导致两个内容完全相同的表达式被判断为不同。如果需要深度比较,第三个可选参数objectequality需要显式设置为true,比如$ watch( ;someexp ,函数{...},真)。
angular还提供了$watchgroup和$watchcollection方法来监视一个数组或一组属性。
|| $摘要函数| |角度
如前所述,angular扩展了浏览器的事件周期。什么?;怎么了?
在view上接受事件指令转发的事件时,会切换到angular的上下文环境来响应此类事件,并触发$ term的$ term摘要循环。
$digest循环实际上包括两个while循环。它它们是:$evalasync的异步操作队列和$watch的观察器队列。
当$digest循环发生时,它将遍历当前$scope及其所有子$ scope上注册的所有观察器函数。
遍历所有观察器函数被称为脏检查。在一轮脏检查后,如果任何观察器监视的值发生了变化,将进行另一轮脏检查,直到所有观察器函数报告它们监视的值没有变化。
当$digest循环结束时,模型的变更结果被更新到dom。这可以合并多个更新,并防止频繁的dom属性。
需要注意的是,在$digest循环结束之前,如果超过10轮脏检查,就会抛出异常,阻止脏检查无限期进行下去。
什么时候它会进入这个角度的背景,并引发 脏检查机制 ?这个问题很重要,也很头疼。
每个进入angular context环境的事件都会执行一个$digest循环。对于ngmodel监控的表单交互控件,每一个字符输入都会触发一个循环来检查$watcher函数,以便及时更新视图。angular1.3之后,ngmodeloptions可用于配置,以修改默认触发模式。
|| $应用于| |角度
$digest是一个内部函数,不应该在正常的应用程序代码中直接调用。如果要主动触发,应该调用作用域。$apply函数,这是一个触发angular 脏检查机制 。
需要注意的是angular只能管理它知道的行为触发方法,但是can t涵盖所有角度操作场景。这就是为什么当我们打包第三方jquery插件时,我们可以 t自动更新视图,但是我们需要调用$scope。$手动应用。
在集成jquery插件时,有时会出现正在进行的摘要错误。如果你还能 排除bug后无法解决,可以考虑用$ term来解决。
神奇的使用$ term出来
在延迟任务中修改绑定到接口的变量,那么window.settimeout就不会触发 肮脏的检查和更新用户界面。您可能会想:添加$scop: $摘要已在进行中
什么?;这是怎么回事?哦,棱角分明该部正在进行一项调查肮脏的检查和。一个聪明的程序员巧妙地编写了下面的代码来解决这个问题:
函数safeapply(scope,fn){ (scope.phase||scop:示波器。$ apply(fn);}代码,在执行apply函数之前,它会先检查是否有 肮脏的检查和angular内部,如果有,就直接执行函数,不需要$ apply否则,脏检查不会启动,因此$apply会执行该函数。呵呵 完美 解决方案,isn 不是吗?
请注意,作者在上面完美这个词上加了引号。angular为我们内置了$ term $timeout服务,通过在angular中封装原生javascript window.settimeout来实现。
有许多美妙的使用$ term超时,但我们不能滥用它。用$ term超时来实现应用功能不应该是我们的第一个计划。第一个计划应该仍然使用angular 的内置指令。
以上是本文的全部内容。希望对大家有帮助 s学习,希望大家多多支持。
标签:
检查功能循环触发器
了解更多角脏检测机制原理(角脏检测)相关内容请关注本站点。