AngularJs中$digest和$apply

2017年12月03日Web前端

AngularJS通过循环($digest)检查model和view的变化实现双向数据绑定。当一个事件被触发时,Angular会触发每一个watcher,这是我们已知的$digest循环。当我们需要强制手动运行一个循环时,需要做出一个正确的选择。

$apply

这个方法可以让你显式启动digest循环,这意味着所有的watcher都将被检测。在北部之星一个可选的方法之后,会调用$rootScope.$digest()。

$digest

使用digest方法只在当前作用域和他的子作用域启动$digest循环,他副作用域将不会被检测也不会被影响。

总结

  • 仅当浏览器DOM事件在Angular之外被触发时使用$apply或$digest。
  • 如果只需要更新当前作用域或他的子作用域,使用$digest,防止在整个应用里运行digest循环。
  • $apply()绑定过多会引起性能问题。
  • 在Angular1.2.x以上的版本中,可以使用$evalAsync()方法,这个方法将在当前循环或下个循环中执行表达式,提高应用的性能。