如何在匿名函数返回之前延迟/推迟路由/控制器?在应用程序引导程序中,我默认rootScope.me
作为来宾帐户,直到它可以检查登录用户的cookie。
我有一个控制器testCtrl
,它依赖于rootScope.me
数据来加载适当的用户数据。在rootScope.me
有机会设置给用户之前触发控制器。
我知道Angular有$q服务来解决承诺,但我不知道如何将其应用于路由。
angular
.module('DDE', [])
.run(['$rootScope', 'Me', function($rootScope, Me) {
$rootScope.me = {
username : 'Guest',
id : -1
};
if (Cookies.get('user_id') && Cookies.get('username')) {
Me.getProfile({user_id : Cookies.get('user_id')}).success(function (res) {
$rootScope.me = res;
}).error(function (err) {
console.log('Error: ', err);
});
}
}])
.config(['$routeProvider', '$httpProvider', '$authProvider',
$routeProvider.
when('/test', {
templateUrl: '/html/pages/test.html',
controller: 'testCtrl'
}).
.config(['$routeProvider', '$httpProvider', '$authProvider', '$stateProvider', '$urlRouterProvider',
function($routeProvider, $httpProvider, $authProvider, $stateProvider, $urlRouterProvider) {
//Cannot inject services like Me or $rootScope as I need
function loadProfile () {
Me.getProfile({user_id : Cookies.get('user_id')}).success(function (res) {
$rootScope.me = res;
}).error(function (err) {
console.log('Error: ', err);
});
}
$stateProvider.
state('test', {
url : '/test',
templateUrl: '/html/pages/test.html',
controller : 'testCtrl',
resolve : {
ProfileLoaded : function () {
return loadProfile();
}
}
});
答案 0 :(得分:2)
编辑:添加angular的ngRoute示例。
您可以查看ui-router's resolve。在加载/导航到您的州/路线之前,它基本上等待您的承诺得到解决。
必须解决下面解决的每个对象(通过 deferred.resolve()如果它们是一个承诺)在控制器之前 实例化。注意每个解析对象如何作为a注入 参数进入控制器。
这是angular's documentation中的angular的ngRoute示例:
.config(function($routeProvider, $locationProvider) {
$routeProvider
.when('/Book/:bookId', {
templateUrl: 'book.html',
controller: 'BookController',
resolve: {
// I will cause a 1 second delay
delay: function($q, $timeout) {
var delay = $q.defer();
$timeout(delay.resolve, 1000);
return delay.promise;
}
}
})