首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深入AngularJS源码,写自己的 JngularJS(2)

大家好,继续写我的 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 来实现同样的功能。

一切工作都做好了,开始测试

今天就到这里吧。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180212G020JG00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券