为什么我们将函数参数传递给$ scope。$ apply

时间:2015-11-19 08:09:34

标签: javascript angularjs angularjs-scope

当我开始阅读$ digest和$ apply时,我清楚地理解了这两者。

但是当我开始探索$ apply

时,我歪曲了下面的代码
$scope.$apply(function(){
     $scope.isLoggedIn = true;
});

在$ scope中传递函数参数的需要是什么。$ apply功能。?任何方式$ scope。$ apply将调用$ rootscope。$ digest它将触发所有观察者并且值将更新到视图。那么为什么我们在$ apply函数中传递函数参数。

3 个答案:

答案 0 :(得分:0)

假设您已经知道when to use $scope.$apply,请查看$apply docs中的伪代码:

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

如果您将功能传递给$apply,则会将其转发至$eval

eval的文档显示我们可以传递字符串或函数。

  
      
  • string:使用expression
  • 中定义的规则执行   
  • function(scope):使用当前范围参数执行该函数。
  •   

在您的情况下,您正在传递一个功能。简单地使用当前范围作为第一个参数来评估该函数。

$scope.$apply(function(scope) {
  scope === $scope;
});

因此,简而言之:可以使用函数参数调用$apply,该函数参数将在范围摘要开始之前进行安全评估。

答案 1 :(得分:0)

听起来你在问我们何时想要使用$scope.$apply。在Angular之外集成值时,这一点至关重要。例如:

$scope.$apply(function(scope) { 
  var aValue = 'shemp'; 
  $scope.valueOnScope = aValue; 
});

现在,框架可以添加一个完全不属于AngularJs的aValue。您可以使用游戏库中的值(如 phaser )或可视化库(如 D3 )来执行此操作,但通常会使用常量,因为$ apply只会更新值曾经,除非你故意把它放在某种循环中,或者更常见的是,它是一个事件处理程序。

$ apply可以成为强制完整的$ digest运行的好工具,并且您会发现许多开发人员为此目的使用它。如果你希望AngularJs在框架外更新一个值,那么你最好在它上面加一个$ watch,然后是$ apply。

$ apply确实会在你的角度程序中运行所有观察者的$ digest,所以为了优化你的代码,你可能需要谨慎使用$ apply。

答案 2 :(得分:-1)

你展示的代码很奇怪。这没有任何意义,因为$ digest将在没有$ scope的情况下被调用。$ apply。

$ scope。如果你正在做一些Angular以外的事情,应该调用$ apply。