一些知名的批评和缺陷。他们都涉及到$digest loop(更新周期)中一个很常见的问题:如何在Angular之外更新$scope?
在哪调用 $apply?
更佳的做法是确保你是在$digest loop之外时调用$apply,比如在"link"指令(directive)响应函数内部使用。
也就是说,只能在$controller之外调用$apply,这样它就可以访问到HTML或其他controller控制器的声明代码 - 比如apply调用link指令并触发相应功能,这时侯是肯定在$digest loop之外的。
如何处理AngularJS之外抛出的错误?
$scope.$apply()接收一个函数或Angular表达式字符串,并执行它,然后调用 $scope.$digest()来更新所有绑定或侦听者。
如果你的代码是不是包裹在函数中传递给$apply,它抛出了一个错误,该错误在AngularJS之外抛出,这意味着在你的应用中的错误处理机制无法处理它。$apply不仅仅执行你的代码,它内部的try / catch语句让你的错误总是能被捕捉到,并且$digist是最后的保障,它意为着即使一个错误抛出,它仍能运行。这是相当不错的。
因此,我们应该将表述改为在Angular之外且在$apply之内更新$scope。
总结
希望您现在了解应该何时以及如何使用$apply()。如果你只需要AngularJS为您提供的功能,那您用到它的概率并不高。但是,如果你写自定义指令,并且直接操纵DOM元素,理解它是很有必要的。