补充——理解$watch ,$apply 和 $digest --- 理解数据绑定过程
2016-07-26 19:23
661 查看
<!DOCTYPE html> <html ng-app="app"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>无标题文档</title> <script type="text/javascript" src="angular.min.js"></script> </head> <body> <div ng-controller="MainCtrl"> <input ng-model="name" /><br> <clickable foo="foo" bar="bar"></clickable> </div> <script> app = angular.module('app', []); app.controller('MainCtrl', function($scope) { $scope.name = "aaa"; $scope.foo = 0; $scope.bar = 0; }); app.directive('clickable', function() { return { restrict: "E", scope: { foo: '=', bar: '=' }, template: '<ul style="background-color: lightblue"><li>{{foo}}</li><li>{{bar}}</li></ul>', link: function(scope, element, attrs) { element.bind('click', function() { scope.foo++; scope.bar++; }); } } }); </script> </body> </html>
点击自定义指令对应的ul列表时,数据模型foo、bar的值会自增,但视图上不会有更新,因为没有手动的调用 $apply() 以触发$digest 循环($digest 循环会处理$watch队列)。
而如果此时改变输入框的值,输入框改变对应的事件发生,该事件对应的函数会被包裹在一个函数中,传给$scope.$apply()作为参数,其中触发$digest循环,处理所有$watch队列。
此处有一个疑问就是,这里所指的所有$watch指的是一个controller中还是一个angualr应用中的即ng-app的范围内,下面实践了一下:
<!DOCTYPE html> <html ng-app="app"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>无标题文档</title> <script type="text/javascript" src="angular.min.js"></script> </head> <body> <div ng-controller="MainCtrl"> <input ng-model="name" /> </div> <div ng-controller="subCtrl"> <clickable foo="foo" bar="bar"></clickable> </div> <script> app = angular.module('app', []); app.controller('MainCtrl', function($scope) { $scope.name = "aaa"; }); app.directive('clickable', function() { return { restrict: "E", scope: { foo: '=', bar: '=' }, template: '<ul style="background-color: lightblue"><li>{{foo}}</li><li>{{bar}}</li></ul>', link: function(scope, element, attrs) { element.bind('click', function() { scope.foo++; scope.bar++; }); } } }); app.controller('subCtrl', function($scope) { $scope.foo = 0; $scope.bar = 0; }); </script> </body> </html>
结论:
一次$digest中,包含一个angular app的范围内的所有$watch都会被执行。相关文章推荐
- angular.element方法汇总
- 深入学习JavaScript的AngularJS框架中指令的使用方法
- 仿Angular Bootstrap TimePicker创建分钟数-秒数的输入控件
- Angular用来控制元素的展示与否的原生指令介绍
- 使用angular写一个hello world
- vue,angular,avalon这三种MVVM框架优缺点
- 使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室
- AngularJS页面访问时出现页面闪烁问题的解决
- 利用CSS3在Angular中实现动画
- 初识angular框架后的所思所想
- 实例剖析AngularJS框架中数据的双向绑定运用
- 理解Angular数据双向绑定
- Angular中的Promise对象($q介绍)
- Angular实现form自动布局
- 在AngularJS中使用jQuery的zTree插件的方法
- 自定义Angular指令与jQuery实现的Bootstrap风格数据双向绑定的单选与多选下拉框
- angular简介和其特点介绍
- AngularJS使用angular-formly进行表单验证
- 详解JavaScript的AngularJS框架中的作用域与数据绑定
- 给angular加上动画效遇到的问题总结