【发布时间】:2017-02-26 13:53:58
【问题描述】:
这是一个非常常见的问题,但我从未找到合适的答案。我遇到了三个答案,但没有一个总是有效。
$apply:这将强制更新,但如果在进行摘要时调用它会随机出现错误。
“安全应用”,在调用 $apply 之前正在检查摘要。由于某种我无法确定的原因,这并不总是更新视图。此外,在 check 和 $apply 之间开始摘要的可能性很小。
$timeout:根据文档,这应该可以可靠地工作,但似乎并不总是更新视图。
来自 $timeout 文档,参数 invokeApply:
如果设置为 false,则跳过模型脏检查,否则将在 $apply 块中调用 fn。 (默认:真)
它永远不会出错,但有时在页面加载期间不会更新视图。
这是一个在页面初始化期间出现问题的代码示例:
EditService.getEvents(Gparams.curPersonID)
.then(function successCallback(response) {
if (response.status=='200') {
do some stuff
} else {
handle an error
}
var timer = $timeout(function() { })
.then(function successCallback(response) {
do something
});
$scope.$on("$destroy", function(event {
$timeout.cancel(timer)});
}); });
正确答案是什么? 请不要只说什么,还要讨论原因。
【问题讨论】:
-
调用 $apply() 不会“随机”抛出错误。如果您在摘要中错误地调用它,它会抛出一个,恕我直言,这表明您不了解自己在做什么。您只需要在不使用 Angular 内置服务和指令来处理事件、AJAX 请求等时调用 $apply。如果您正在这样做,那么您应该意识到这一点,并且 $apply() 很好。
-
尝试重新输入
$digest或$apply而其中一个已经在进行中,这通常表示需要修复的编程错误。所以AngularJS会在发生这种情况时抛出这个错误。这是为了防止很难检测到的错误进入您的应用程序。
标签: angularjs timeout apply digest