大家好,继续写我的 JngularJS 这里少了一个原音,还是叫 JangularJS 好一些,毕竟是基于人家的东西写的,还是需要保留 angularjs 加上自己特性 J 。
6.更新了 digest 后,我们看一看可能会带来哪些问题。如果存在两个 watch 间相互调用,这样 digest 就会一直执行下去。
这样一来程序也变得不稳定了,为了防止发生类似情况,我们需要都 digest 动一些手脚。
我需要确保 digest 在一个可接受的循环次数内,稳定地运行。digest 超出这些次数后如果 scope 还在变化,我们就需要抛出异样停止 digest 运行。我们这里将可接受的次数设置为 10 ,是考虑到我们对性能要求很高,所以设置为 10,你也可以设置大点。
7. 进行深度的脏值检查
在之前,我们一直使用严格模式 === 来检查新旧值是否相等,这种方式在大多数情况下都好用,对于那些基础数据类型也没有问题。但是我们还需要考虑到数组和对象这些数据类型。需要检查对象或数组内部值是否相等。所以我需要逐层遍历对象或数组以找出新旧值是否存在不同处。
我们为$watch方法添加第三次参数,类型为boolean用于控制在判断新旧是否相等时是否开启深入检查模式。大家已经发现了我们在 valueEq 加了!!, 这是为了确保 valueEq 为 true 一种习惯做法。
我们也对$$digestOnce 进行一些调整。
比较数组、对象或他们混合的对象是否相等,我们需要对他们进行逐层遍历以比较是否相等,Angular 用其内置的方法来进行深层对比对象,这里我们 lodash 提供的 isEqual 来实现同样的功能。
一切工作都做好了,开始测试