Page 352 - AngularJS权威教程
P. 352
332 第 23 章 digest 循环和$apply
你还可以使用它替代setTimeout()函数,但是它可能在浏览器重新渲染视图之后导致屏幕
闪烁。
23.7 $apply
$apply()函数可以从Angular框架的外部让表达式在Angular上下文内部执行。例如,假设你
实现了一个setTimeout()或者使用第三方库并且想让事件运行在Angular上下文内部时,就必须
使用$apply()。
$apply()函数接受一个可选的参数:
expression(字符串/函数)
这个表达式可选地接受一个字符串或函数,并且是在当前作用域内执行。
如果传入一个字符串, $apply()首先会在这个字符串上调用$eval(),以强制Angular在局部
作用域上下文中使用$eval()运行字符串表达式。
如果传入一个函数,这个函数将会在所传入的函数作用域上执行。
$exceptionHandler服务会捕获和处理$eval()方法抛出的所有异常。最后,$apply()方法
还会直接调用$digest循环。
// 使用要eval的字符串调用$apply示例
$scope.$apply('message = "Hello World"');
// 使用函数的方式并给函数传入一个作用域
$scope.apply(function(scope) {
// 然后在函数中使用传入作用域
scope.message = "Hello World";
});
// 使用函数时忽略作用域
$scope.$apply(function() {
$scope.message = "Hello World";
});
// 或者通过在操作的尾部调用$apply()以强制运行$digest循环
$scope.apply();
简而言之,使用$scope.$apply()时可以从外部进入上下文。
如果在事件被触发时调用$apply(),就会使用Angular事件循环来运行它。如果没有调用
$apply(),就不会在事件循环内执行这个函数,而它会运行在Angular上下文外部。
23.8 何时使用$apply
通常可以依赖于Angular提供的可用于视图中的任意指令来调用$apply()。所有ng-[event]
指令(比如ng-click、ng-keypress)都会调用$apply()。
此外还可以依赖于一系列Angular内置的服务来调用$digest()。比如$http服务会在XHR请
求完成并触发更新返回值(promise)之后调用$apply()。
无论何时我们手动处理事件,使用第三方框架(比如jQuery、Facebook API),或者调用
setTimeout(),都可以使用$apply()函数让Angular返回$digest循环。