angularJS中$apply()方法详解(2)


functionCtrl($scope) {
  $scope.message ="Waiting 2000ms for update";   
  setTimeout(function () {
    $scope.message ="Timeout called!";
     // AngularJS unaware of update to $scope
  }, 2000);
}

上面的代码执行后页面上会显示:Waiting 2000ms for update。显然数据的更新没有被angular JS觉察到。
     接下来,我们将Javascript的代码稍作修改,用scope.apply()包起来。

复制代码 代码如下:


functionCtrl($scope) {
  $scope.message ="Waiting 2000ms for update";
  setTimeout(function () {
    $scope.$apply(function () {
       $scope.message ="Timeout called!";
      });
  }, 2000);
}

这次与之前不同的是,页面上先会显示:Waiting 2000ms for update,等待2秒后内容会被更改为:Timeout called! 。显然数据的更新被angular JS觉察到了。
     NOTE:我们不应该这样做,而是用angular JS提供的timeout方法,这样它就会被自动用apply方法包起来了。

科学是把双刃剑
     最后,我们再来瞅一眼scope.apply()和scope.apply(function)方法吧!虽然angular JS为我们做了很多事情,但是我们也因此丢失了一些机会。从下面的伪代码一看便知:

复制代码 代码如下:


function$apply(expr) {
  try {
    return$eval(expr);
  } catch(e) {
    $exceptionHandler(e);
  } finally {
    $root.$digest();
  }
}

  它会捕获所有的异常并且不会再抛出来,最后都会调用$digest()方法。

总结一下

  $apply()方法可以在angular框架之外执行angular JS的表达式,例如:DOM事件、setTimeout、XHR或其他第三方的库。这仅仅是个开始,水还有很深,欢迎大家一起来deep dive!

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wgxgsy.html