$ locationPath导致错误:[$ rootScope:inprog]

时间:2016-01-08 11:54:50

标签: javascript angularjs routes

我需要在我的角度js webapp中切换视图。

为了处理路由,我使用$ stateProvider,如下所示:

.config(['$httpProvider', '$stateProvider', '$urlRouterProvider', function ($httpProvider, $stateProvider, $urlRouterProvider) {
        $stateProvider
            .state('common', {
                templateUrl: 'assets/html/template.html',
                abstract: true,
            })
            .state('login', {
                url: '/login',
                parent: 'common',
                templateUrl: 'app/models/authentication/views/login.html',
                controller: 'LoginController'
            })
            .state('home', {
                url: '/',
                parent: 'common',
                templateUrl: 'app/models/home/views/home.html',
                controller: 'HomeController'
            })
            ...

在我的登录控制器中,我正在尝试切换视图(从登录到主页)

  .controller('LoginController', ['$scope', '$rootScope', '$cookieStore', '$location', '$window', '$http',
function ($scope, $rootScope, $cookieStore, $location, $window, $http) {

        $scope.login = function () {

            loadHttp();
        };

        function loadHttp() {
            var url = "http://myurl";
             ...
                .then(function (response) {
                    $scope.$apply(function () {

                        $location.path('/home');
                        console.log("$location.path: " + $location.path);
                    });
                });
        }

但是当我到达 $ location.path(' / home'); 时,我收到此错误:

Error: [$rootScope:inprog] http://errors.angularjs.org/1.4.8/$rootScope/inprog?p0=%24digest
    at Error (native)
    at http://localhost:3000/adminTool/assets/js/angular.min.js:6:416
    at t (http://localhost:3000/adminTool/assets/js/angular.min.js:126:132)
    at r.$apply (http://localhost:3000/adminTool/assets/js/angular.min.js:133:515)
    at http://localhost:3000/adminTool/app/models/authentication/controllers.js:46:32
    at http://localhost:3000/adminTool/assets/js/angular.min.js:119:129
    at r.$eval (http://localhost:3000/adminTool/assets/js/angular.min.js:133:313)
    at r.$digest (http://localhost:3000/adminTool/assets/js/angular.min.js:130:412)
    at r.$apply (http://localhost:3000/adminTool/assets/js/angular.min.js:134:78)
    at g (http://localhost:3000/adminTool/assets/js/angular.min.js:87:444)

我做错了什么?如何摆脱它,最后切换视图?

我读过SO

使用$ apply

PS:我对角度

非常新

2 个答案:

答案 0 :(得分:1)

您得到的错误是因为$scope.$apply声明周围的$location.path('/home')。 Angular已经在一个摘要循环中,因此在该循环内再次触发它(通过调用$apply)会给你这个错误。删除$scope.$apply可能会解决您的问题。

摘要循环已被触发的原因是因为您可能正在使用$http服务,该服务使用promise来返回值。 Angular在解决此承诺时总是触发摘要。

但除此之外,您可能希望使用$state服务转移到其他状态,而不是使用$location服务移动到其他位置。 $state.go('home')可能就是你要找的东西。

答案 1 :(得分:1)

我认为这是问题$location.path('/home'); 您没有路径/home,其状态为home 所以你需要去$location.path('/');或注入$state并使用方法$state.go('home'),你也不需要把它包裹在$apply