这是一个非常常见问题,但我从来没有找到适当的答案。我遇到了三个答案,但没有一个总是有效。
$ apply:这将强制进行更新,但如果在摘要进行过程中调用它,则会随机发生错误。
"安全申请"在调用$ apply之前检查正在进行的摘要的位置。由于我无法确定的某些原因,这并不总是更新视图。此外,在支票和$ apply之间开始摘要的可能性很小。
$ timeout:根据文档,这应该可靠地运行,但似乎并不总是更新视图。
如果设置为false,则跳过模型脏检查,否则将在$ apply块中调用fn。 (默认值:true)
它永远不会出错,但有时在页面加载期间不会更新视图。
以下是在页面初始化期间出现问题的代码示例:
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)});
}); });
答案是正确的? 请不要只是说什么,还要讨论原因。
答案 0 :(得分:0)
以下是在页面初始化期间出现问题的代码示例
.then
方法没有更新DOM的一个常见原因是promise不是AngularJS $q service的承诺。解决方案是使用$q service promise将可疑承诺转换为$q.when method。
//EditService.getEvents(Gparams.curPersonID)
//CONVERT to $q service promise
$q.when(EditService.getEvents(Gparams.curPersonID))
.then(function successCallback(response) {
if (response.status=='200') {
do some stuff
} else {
handle an error
}
$q service promise的.then
方法与AngularJS框架及其摘要周期集成在一起。对范围模型的更改将自动更新DOM。
当
将可能是值的对象或(第三方)随后的承诺包含到$q promise中。当您处理可能会或可能不是承诺的对象,或者承诺来自不可信任的源时,这非常有用。