【问题标题】:Error: $digest already in progress in angularjs when using alert错误:使用警报时,angularjs 中的 $digest 已经在进行中
【发布时间】:2013-05-03 03:37:30
【问题描述】:

我只是从控制器中的服务获取 json 数据。

我正在使用回调函数在加载成功时打印成功消息。它工作正常,但也抛出了我在问题中提到的错误

//JSON file
{
"pc":"name"
}

// angular services
var service = angular.module('Services', ['ngResource']).
factory('Widgets', function($resource){
    return $resource('/json/home.json', {}, {
        query: {method:'GET', params:{}, isArray:false}
    });
});

//controller
function editWidget($scope, Widgets) {
 $scope.data = Widgets.query(function(data) {   
    alert("Success Data Loaded ---> " + JSON.stringify(data.pc));
 });
}

【问题讨论】:

  • 这段代码没有问题——你的问题一定出在其他地方。当您执行$scope.$apply(...) 时,您通常会收到此错误消息
  • 警报是否失败?如果警报给您带来问题,如何使用 console.log 查看 json 的值?
  • @BoxerBucks 是的,当我使用 console.log 时,它不会引发错误。但我只是想知道错误的原因。
  • 这是代码中没有错误的工作证明:plnkr.co/edit/YDsjQIkBj9JtTZn3V4qX?p=preview

标签: angularjs


【解决方案1】:

alert,以及confirmprompt 将暂停代码的执行(阻塞线程),在此期间,如果应该在暂停期间触发超时和间隔,它们就会完全失控。 $digest 循环由两个较小的循环组成,分别处理$evalAsync 队列和$watch 列表。 $evalAsync 队列用于安排需要在当前堆栈框架之外但在浏览器视图呈现之前发生的工作。这通常使用setTimeout(0) 完成。您在此期间的警报会导致问题。

【讨论】:

  • 这绝对是问题所在,但除了不使用警报之外还有其他解决方案吗?
  • 使用非阻塞警报(模态)。你甚至可以覆盖 window.alert 来调用你的模态。您还可以设置模态警报的样式,并且看起来比原生警报更好。
【解决方案2】:

您可以在摘要循环完成后使用 $timeout 执行警报,这样可以避免此错误。

$timeout(function () {
    alert('Alert text');
 }); 

别忘了在你的指令中注入 $timeout

【讨论】:

    【解决方案3】:
    if(!confirm('Your message')){
      return false;
    }else {
      return false;
    }
    

    在这两种情况下都返回 false。

    【讨论】:

      【解决方案4】:

      @TheSharpieOne 是对的,它对我有用。

      function delayalert(messagestr){
                 setTimeout(function(){
                      alert(messagestr);
                  },0);
      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-28
        • 2014-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-12
        • 2014-03-18
        相关资源
        最近更新 更多