angularjs:$ apply(fn)优于$ apply()

时间:2015-12-18 06:58:04

标签: angularjs function apply

我正在读书 http://angular-tips.com/blog/2013/08/watch-how-the-apply-runs-a-digest/

指令链接功能:

element.bind('click', function() {
  scope.foo++;
  scope.bar++;

  scope.$apply();
});

使用$ apply的更好方法:

element.bind('click', function() {
  scope.$apply(function(){
    scope.foo++;
    scope.bar++;
  });
});

有什么区别?不同之处在于,在第一个版本中,我们正在更新角度上下文之外的值,因此如果抛出错误,Angular将永远不会知道。显然,在这个微小的玩具示例中它不会有太大的区别,但想象一下,我们有一个警告框向我们的用户显示错误,我们有一个第三方库进行网络呼叫但失败了。如果我们不将它包装在$ apply中,Angular将永远不会知道失败,并且警报框不会出现在那里。

混乱:   为什么角度需要知道错误,我只需要为用户显示它。例如,在指令的链接fn中有一个ajax请求,我只需要告诉失败时发生了什么。

1 个答案:

答案 0 :(得分:0)

TAngular $ scope有一个名为$ apply()的函数,它将函数作为参数。 AngularJS表示只有在$ apply()内部完成突变时才会知道模型变异。所以你只需要将更改模型的代码放在函数中并调用$ scope.apply(),将该函数作为参数传递。 $ apply()函数调用结束后,AngularJS知道可能发生了一些模型更改。然后它通过调用另一个函数 - $ rootScope。$ digest() - 开始一个摘要周期 - 它传播到所有子范围。在摘要周期中,会调用观察者来检查模型值是否已更改。如果值已更改,则会调用相应的侦听器函数。现在,听众如何处理模型更改。

Ajax通过Angular buildin $ http调用模型变异代码隐式包含$ apply()调用,因此您不需要任何额外的步骤。