在AngularJS中,当模型更改时强制更新视图的最佳方法是什么?
这是一个非常常见的问题,但我从未找到正确的答案。我遇到了三个答案,但没有一个总是有效的在AngularJS中,当模型更改时强制更新视图的最佳方法是什么?,angularjs,timeout,apply,digest,Angularjs,Timeout,Apply,Digest,这是一个非常常见的问题,但我从未找到正确的答案。我遇到了三个答案,但没有一个总是有效的 $apply:这将强制更新,但如果在摘要进行过程中调用,则会随机通过错误 “安全应用”,其中在调用$apply之前有一个正在进行的摘要检查。由于我无法确定的原因,这并不总是更新视图。此外,在支票和$apply之间开始摘要的可能性很小 $timeout:根据文档,这应该可以可靠地工作,但似乎并不总是更新视图 从$timeout文档中,参数invokeApply: 如果设置为false,则跳过模型脏检查,否则将在
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)});
}); });
正确答案是什么请不要只说什么,还要讨论为什么 下面是一个代码示例,在页面初始化过程中出现问题
方法不更新DOM的一个常见原因是该承诺不是AngularJS承诺。解决方案是将可疑的承诺转换为具有
然后a的。方法与AngularJS框架及其摘要循环集成。对范围模型的更改将自动更新DOM
什么时候
将可能是值或(第三方)的对象包装到。当您处理的对象可能是承诺,也可能不是承诺,或者承诺来自不可信任的来源时,这非常有用
调用$apply()不会“随机”抛出错误。当你已经在摘要中时,如果你不正确地调用它,它就会抛出一个,IMHO,这表示你不理解自己在做什么。当不使用angular内置服务和指令来处理事件、AJAX请求等时,只需调用$apply即可。如果这样做,那么您应该知道它,并且$apply()很好。当其中一个正在进行时,尝试重新输入$digest
或$apply
通常是需要修复的编程错误迹象。所以AngularJS会在发生错误时抛出这个错误。这是为了防止很难检测到的bug进入应用程序。
//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
}