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

时间:2017-02-26 13:53:58

标签: angularjs timeout apply digest

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

  1. $ apply:这将强制进行更新,但如果在摘要进行过程中调用它,则会随机发生错误。

  2. "安全申请"在调用$ apply之前检查正在进行的摘要的位置。由于我无法确定的某些原因,这并不总是更新视图。此外,在支票和$ apply之间开始摘要的可能性很小。

  3. $ timeout:根据文档,这应该可靠地运行,但似乎并不总是更新视图。

  4. <$>来自$ 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)});
    });                                                                                     });     
    

    答案是正确的? 不要只是说什么,还要讨论原因。

1 个答案:

答案 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中。当您处理可能会或可能不是承诺的对象,或者承诺来自不可信任的源时,这非常有用。

     

--AngularJS $q Service API Reference - $q.when