Angular如何在$digest循环后更新视图
How does Angular update the view after a $digest cycle?
是否:
1) 运行DOM(从ng-app
开始),如果它看到一个带有指令的DOM节点,则使用相应的模型值更新该DOM节点。
或
2) 在运行$$watchers
列表时,如果它检测到更改,它会引用需要更新的DOM节点,所以它只是这样做(因此,使用这种方法,它不会运行整个DOM,而是存储并使用对$$watchers
中节点的引用)。
这更多的是第二种方法。
Angular通过指令完成所有繁重的工作。你在Angular中使用的几乎所有东西都是一个指令:
<div ng-app>
<div ng-controller>
<button ng-click>
<!-- input is actually a directive -->
<input ng-model="foo" />
所有这些小指令都获得了对它们所附加的DOM元素的引用,以及一个$scope
对象指令只是注册一个回调,以便在发生更改时执行
正如您已经注意到的,这些被称为观察者
作用域是分层次的,所以总是有一个相关对象树组成应用程序状态。当$digest
循环开始时,它递归地遍历该树以寻找更改,并启动回调(也称为观察者)。
然后回调可以选择执行它想要的任何操作。只是在大多数情况下,它是在更新DOM
归根结底,它是如何发生的并没有什么神奇之处。只是回调的一种结构,当某些事情发生变化时就会执行。
下面是一个愚蠢的自定义指令示例,该指令注册一个观察程序,并在某个属性更改时更新DOM。
(function(){
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min)) + min;
}
function updateValue(){
return {
restrict:'A',
link: function(scope, elem, attrs){
elem.on('click', function(){
//You would never actually do this, but
// it's a demo
scope[attrs.updateValue] = "rgb(" +
getRandomInt(0, 255) + "," +
getRandomInt(0, 255) + "," +
getRandomInt(0, 255) + ")";
//kick off a digest loop manually
// this is similar to what a lot of angular
// directives do.
scope.$digest();
});
}
};
}
function sillyDomChangeOn(){
return {
restrict:'A',
link: function(scope, elem, attrs){
scope.$watch(attrs.sillyDomChangeOn, function(newVal, oldVal){
elem.css('color', newVal);
});
}
};
}
angular.module('my-app', [])
.directive('updateValue', updateValue)
.directive('sillyDomChangeOn', sillyDomChangeOn);
}());
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css">
<div ng-app="my-app" class="container">
<button type="button" class="btn btn-primary" update-value="randomVal">Update Value</button>
<h3>Value: <code>{{randomVal}}</code></h3>
<div class="well" silly-dom-change-on="randomVal">
<h3>This is just a random DIV</h3>
<div>
</div>
相关文章:
- Javascript循环不会自我更新
- Jquery-每个循环不更新变量
- 循环对象时更新页面上的DIV元素
- 使用条件for循环更新数组-Javascript
- 在for循环中未正确更新React本机密钥
- 表单中的 jQuery DOM 不会在 for 循环中更新
- 循环遍历表行,获取总计和更新行
- Php循环不会在浏览器上更新
- 在循环锁定浏览器时暂停执行(用fiddles更新)
- 使用循环更新 JSON 属性值
- 我怎么能有一个实时计时器,在3秒的循环内每秒钟更新一次
- 通过响应按钮单击更改表标题,其中行使用 JSTL for 循环更新
- 异步mongodb更新循环中最后一次迭代后的重定向
- AngularJS:在长时间循环期间强制更新DOM(即进度指示器)
- 无限循环当观察父对象时,观察者不更新任何值
- 使用jQuery循环+更新DB
- 从JavaScript for循环更新PHP
- Javascript无限循环更新实体
- 如何使用 for 循环更新 MongoDB 中的对象数组
- 使用嵌套循环更新视图模型挖空