相关推荐:《angularjs教程》
angularjs实现了双向绑定,与vue的defineProperty不同,它的原理在于它的脏检查机制,以下做了一些总结;
简而言之: 当作用域创建时,angular会去解析模板,将绑定值和事件调用找出来并用$watch绑定;
$scope.$watch(string|function, listener, objectEquality, prettyPrintExpression) // string: 验证值或者function执行后return的string // listener: 如果验证值不同,则执行该监听函数 // objectEquality:执行深检查
接下来的流程:
判断dirty是否为true,如果为false,则不进行$digest递归。(dirty默认为true)
遍历$$watchers,取出对应的属性值的老值和新值根据objectEquality进行新老值的对比。
如果两个值不同,则继续往下执行。如果两个值相同,则设置dirty为false。
检查完所有的watcher之后,如果dirty还为true, 设置dirty为true用新值代替老值;
这样,在下一轮递归的时候,老值就是这一轮的新值再次调用$digest(简单说就是执行两次递归遍历检查新旧值变化)
将变化后的$scope重新渲染到界面
function($timeout) { // 当我们通过on('click')的方式触发某些更新的时候,可以这样做 $timeout(() => { // 内置语法糖 $http, $timeout已经包含了apply $scope.name = 'lily' }) // 也可以这样做 $element.on('click', () => { $scope.name = 'david' $scope.$apply() }) }
最后,实现一个简易脏检查机制
更多编程相关知识,请访问:编程视频!!
以上是了解angularjs中的脏检查的详细内容。更多信息请关注PHP中文网其他相关文章!