由于$apply 会触发dirty-checking(脏数据检查),使界面重新读取controller数据,常用于数据改变了,但界面没刷新。此问题常见于$apply包裹着已经可以刷新界面的操作。
例如:
$scope.apply(function() {
$scope.a = 10; // 这句本来就能刷新界面
})
解决方法:
-
直接写$scope.a = 10 //这是因为使用不当,一般不会这样,因为不知道哪个操作会刷新界面,但是推荐的是找到会刷新界面的语句,把它移出$apply
-
将$apply换成$evalAsync, 下面是对$evalAsync的生命周期解释
directive: dom 操作 => $evalAsync => render
controller: $evalAsync => dom操作 => redner
$timeout: dom操作 => render => $evalAsync简言之:$evalAsync是将操作加入当前或者写一个$apply循环中,从而避免多次dirty-checking
参考:
https://stackoverflow.com/questions/17301572/whats-the-difference-between-evalasync-and-timeout-in-angularjs
https://www.panda-os.com/blog/2015/01/angularjs-apply-digest-and-evalasync/
网友评论