<body style="padding: 10px;" ng-app="app" ng-controller="MyCtrl">
<input type="checkbox" ng-checked="check()">
</body>
<script src="node_modules/angular/angular.min.js"></script>
<script type="text/javascript">
angular
.module('app', [])
.controller('MyCtrl',function($scope){
var mm = 1;
$scope.check = function(){
console.log(mm)
mm++;
}
})
</script>
如图所示,再浏览器中刷新页面的时候,发现check()运行了两次,不知道是哪里的原因
angular 是基于
脏检查
更新视图。每次数据发生变化,至少需要两轮
digest。为啥?数据发生变化,第一轮触发watches等;第二轮确保数据没有再发生变化,否则还会触发新一轮digest。ng-checked会产生一个watch,初始化对表达式
check()
求值,数据发生变化(原先是没有值的)。于是,需要至少再一轮digest。如果check()返回mm
,每次都有数据变化,那么会触发十轮digest,并且抛出一个错误:Infinite $digest Loop
。因为digest默认连续触发最多十次。