在AngularJS中,当模型更改时强制更新视图的最佳方法是什么?

在AngularJS中,当模型更改时强制更新视图的最佳方法是什么?,angularjs,timeout,apply,digest,Angularjs,Timeout,Apply,Digest,这是一个非常常见的问题,但我从未找到正确的答案。我遇到了三个答案,但没有一个总是有效的 $apply:这将强制更新,但如果在摘要进行过程中调用,则会随机通过错误 “安全应用”,其中在调用$apply之前有一个正在进行的摘要检查。由于我无法确定的原因,这并不总是更新视图。此外,在支票和$apply之间开始摘要的可能性很小 $timeout:根据文档,这应该可以可靠地工作,但似乎并不总是更新视图 从$timeout文档中,参数invokeApply: 如果设置为false,则跳过模型脏检查,否则将在

这是一个非常常见的问题,但我从未找到正确的答案。我遇到了三个答案,但没有一个总是有效的

  • $apply:这将强制更新,但如果在摘要进行过程中调用,则会随机通过错误

  • “安全应用”,其中在调用$apply之前有一个正在进行的摘要检查。由于我无法确定的原因,这并不总是更新视图。此外,在支票和$apply之间开始摘要的可能性很小

  • $timeout:根据文档,这应该可以可靠地工作,但似乎并不总是更新视图

  • 从$timeout文档中,参数invokeApply:

    如果设置为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)});
    });                                                                                     });     
    
    正确答案是什么请不要只说什么,还要讨论为什么

    下面是一个代码示例,在页面初始化过程中出现问题

    方法不更新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
        }