我需要在我的角度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
使用$ applyPS:我对角度
非常新答案 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