获取AngularJS错误:"[$ rootScope:inprog] $ digest已在进行中"没有手动$ apply

Ted*_*Cap 13 angularjs angularjs-service angularjs-controller angularjs-http

关于此错误的其他帖子总是包括有人试图在不使用安全申请的情况下申请$,但在我的示例中并非如此.我的功能是成功返回我从API请求的数据,但我无法清除这个错误,这让我疯狂.每次在$ http函数中调用.success之前,我都会在控制台中看到"错误:[$ rootScope:inprog] $ digest已在进行中".以下是我的控制器和服务.谢谢!

这是我的服务,包括使用有效负载发布$ http呼叫的功能:

Services.service( 'CoolService', ['$q', '$rootScope', '$http', 'Auth', function($q, $rootScope, $http, Auth){
var service = {
    create: function(payload){
        var deferred = $q.defer();
        $http({
            'url': '/api/endpoint/',
            'dataType':'json',
            'method': 'POST',
            data: payload
        }).success(function(data,status, headers, config){
            deferred.resolve(data);

        })
        .error(function(data, status, headers, config){
            deferred.reject("Error in request.");
        });
        return deferred.promise;
        }
    }
    return service;
}]);
Run Code Online (Sandbox Code Playgroud)

这是我的控制器调用服务:

controllers.controller('CoolCtrl',['$scope', '$modal', '$log','CoolService', function($scope, $modal, $log, CoolService){
    getCoolData = function (input_data) {
        CoolService.create(input_data).then(function(results){
            new_cool = results.results;
        }, function(error){
        console.log("there was an error getting new cool data");
        });
    };
    var payload = {
        user_id: data1,
        cool_id: data2,
    }
    var new_cool_data = getCoolData(payload);
    console.log(new_cool_data);
}]);
Run Code Online (Sandbox Code Playgroud)

var new_cool_data下面的日志在异步操作之前被调用,但是new_cool确实在getCoolData中的.then语句中被赋值.任何帮助摆脱这个错误或使其一般不蹩脚的任何帮助将不胜感激!

这是整个错误:https: //gist.github.com/thedore17/bcac9aec781ef9ba535b

小智 7

添加这个小方法并在apply()中调用它

function CheckScopeBeforeApply() {
    if(!$scope.$$phase) {
         $scope.$apply();
    }
};
Run Code Online (Sandbox Code Playgroud)

  • 这是反模式https://github.com/angular/angular.js/wiki/Anti-Patterns (6认同)