【问题标题】:angularjs $scope.$apply() gives this error: Error: [$rootScope:inprog]angularjs $scope.$apply() 给出了这个错误:错误:[$rootScope:inprog]
【发布时间】:2014-04-17 08:30:00
【问题描述】:

我正在尝试更新属于 $scope 的页面上的一些文本。但我不断收到此错误:

Error: [$rootScope:inprog] [http://errors.angularjs.org/1.2.15/$rootScope/inprog?p0=%24apply][1]
at Error (native)
at https://ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular.min.js:6:450
at m (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular.min.js:101:443)
at h.$apply (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular.min.js:108:301)
at h.$scope.changeLang (http://treenovum.es/xlsmedical/js/medical-app.js:80:16)
at https://ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular.min.js:169:382
at https://ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular.min.js:186:390
at h.$eval (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular.min.js:108:40)
at h.$apply (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular.min.js:108:318)
at HTMLAnchorElement.<anonymous> (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular.min.js:186:372) 

显然我做错了什么。 :) 关于如何解决这个问题的任何想法?我希望页面更新为范围内的新变量。

这是我用于更新的代码:

medicalApp.controller('MainCtrl', function($scope, $cookies, getTranslation) {
    getTranslation.get(function(data){
        $scope.translation = data;
    });

    $scope.changeLang = function (lang) {
        console.log(lang);
        $cookies.lang = lang;
        $scope.$apply(function(){
            getTranslation.get(function(data){
                $scope.translation = data;
                console.log(JSON.stringify($scope.translation));
            });
        });
    };
});

html:

<body ng-controller="MainCtrl">
    ...
            <div class="header-lang col-xs-4">
                <p>
                    <a href="#" ng-click="changeLang('de')">DE</a> | 
                    <a href="#" ng-click="changeLang('fr')">FR</a></p>
            <div>{{ translation.text }}</div>  <---- Example variable I want updated.
    ...

我还在为我加载的每个页面使用带有单独控制器的 ngRoute,如果这与它有任何关系吗?

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    如果您的模板在更改模型后没有更改并且您需要使用$scope.$apply,您可以使用$scope.$applyAsync来代替这个。

    https://github.com/angular-ui/ui-codemirror/issues/73

    【讨论】:

    • 太棒了!这解决了我遇到的一个问题,非常感谢!
    【解决方案2】:

    您在函数changeLang 中使用了$scope.$apply(...),因此您遇到了常见的“已经在摘要中”错误。您无需将对 getTranslation 的调用放在 $scope.$apply(...) 块内,因为 ng-click 已经为您处理好了。把它拉出来,它应该可以工作。另外,我建议使用非缩小版本的 angular for dev 运行,这样您就可以在控制台中看到更好的错误。

    【讨论】:

    • 我不确定您的解决方案是否有效,但我确实意识到问题出在其他问题上。 getTranslation 是一个在页面加载时调用的工厂,但是当我第二次调用它时它被忽略了。你碰巧知道如何解决这个问题吗?
    • 我需要查看 getTranslation 代码,但听起来您正在处理服务的 singleton 生命周期。请记住,角度从其依赖注入容器中分发单例实例。
    【解决方案3】:

    $evalAsync 效果很好:

    $scope.$evalAsync(function() {
        // Code here
    });
    

    或者简单地说:

    $scope.$evalAsync();
    

    请参阅:https://docs.angularjs.org/api/ng/type/$rootScope.Scope#$evalAsync

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-15
      • 1970-01-01
      • 2014-05-09
      • 2015-04-08
      • 1970-01-01
      • 2014-03-18
      • 1970-01-01
      相关资源
      最近更新 更多