【问题标题】:In AngularJS, what is the best way to force a view update when the model changes?在 AngularJS 中,当模型更改时强制视图更新的最佳方法是什么?
【发布时间】:2017-02-26 13:53:58
【问题描述】:

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

  1. $apply:这将强制更新,但如果在进行摘要时调用它会随机出现错误。

  2. “安全应用”,在调用 $apply 之前正在检查摘要。由于某种我无法确定的原因,这并不总是更新视图。此外,在 check 和 $apply 之间开始摘要的可能性很小。

  3. $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


【解决方案1】:

这是一个在页面初始化期间出现问题的代码示例

.then 方法不更新 DOM 的一个常见原因是 promise 不是 AngularJS $q service promise。解决方案是使用$q.when method 将可疑承诺转换为$q service promise

//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。

什么时候

将一个可能是值或(第 3 方)then-able 承诺的对象包装到 $q promise 中。当您处理的对象可能是也可能不是 Promise 时,或者当 Promise 来自不可信的来源时,这很有用。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 2014-02-13
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多