zoukankan      html  css  js  c++  java
  • AngularJS中的$apply

      $apply()方法可以在angular框架之外执行angular JS的表达式,例如:DOM事件、setTimeout、XHR或其他第三方的库。

     当仅仅使用Angular所提供的对象时,你不该过多的使用$apply(),而当你使用directive直接去操作DOM元素时,那就是必要条件了

      关于何时(以及如何)调用$apply,以下是四点简单的提示:

            a.不要频繁调用它。当AngularJS正在快乐地滴滴答答运行(处于它的$digest周期中)的时候,调用$apply将会引起错误。所以,在这里你不能抱有“宁可事先谨慎有余,不要事后追悔莫及“的信条。

            b.当AngularJS外部的控制器(DOM事件、外部的回调函数如jQuery UI空间等)调用了AngularJS函数之后,必须调用$apply。在这种情况下,你需要命令AngularJS刷新自已(模型、视图等),$apply就是用来做这件事情的。

            c.只要可以,请把要执行的代码和函数传递给$apply去执行,而不要自已执行那些函数然后再调用$apply。例如,你应该像下面这样来执行你的代码:

    $scope.$apply(function() {
     $scope.variable1 = 'some value';
    executeSomeAction();
    });

            而不是这样:

    $scope.variable1 = 'some value';
    executeSomeAction();
    $scope.$apply();

            这两种方式的运行效果相同,但是它们存在一个重大的不同点。

            当调用executeSomeAction时,第一种方式会捕获所有错误,而第二种方式会忽略所有错误。所以,只有使用第一种方式,你才能获得AngularJS的错误通知。

            考虑一下使用safeApply(https://codeerwall.com/p/ngisma)之类的方法:

    $scope.safeApply = function(fn) {
     var phase = this.$root.$$phase;
     if(phase == '$apply' || phase == '$digest') {
     if(fn && (typeof(fn) === 'function')) {
    fn();
    }
     }else {
    this.$apply(fn);
    }
    };

            你可以把以上代码monkey patch到最顶层scope或者rootscope上,然后就可以在任何地方使用$scope.$safeApply函数了。

  • 相关阅读:
    2016——3——16 kmp 7题
    bzoj3942——2016——3——15
    bzoj1355——2016——3——15
    poj 3641 ——2016——3——15
    KMP之我见
    转自他人——————TLE之前,没有一个节点叫失败!!!
    省选必知
    bzoj1449————2016——3——14
    bzoj1070————2016——3——14
    bzoj1562[NOI2009]变换序列——2016——3——12
  • 原文地址:https://www.cnblogs.com/ilinuxer/p/5281712.html
Copyright © 2011-2022 走看看