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循环。
   347   348   349   350   351   352   353   354   355   356   357