angularjs 中的通用路由解析器?
Common route resolver in angularjs?
我在 angularjs 中使用路由解析器,因为如果用户未按如下方式登录,用户将被重定向到登录,
$routeProvider
.when('/', {
templateUrl: 'app/components/main/dashboard.html',
controller: 'dashboardController',
resolve: {
login: function ($rootScope, $location) {
if (!$rootScope.currentUser) {
$location.path('/login');
}
}
}
})
这里我想在其他许多路由中使用这个登录功能,所以我可以复制粘贴相同的解析功能到每个地方,如下所示,
.when('/items', {
templateUrl: 'app/components/item/list.html',
controller: 'itemController',
resolve: {
login: function ($rootScope, $location) {
if (!$rootScope.currentUser) {
$location.path('/login');
}
}
}
})
它工作正常,我的问题是,有什么办法可以避免这种代码重复,或者还有其他更好的方法吗?
我昨天建立了一个 github 存储库,它是网络应用程序的起点,包含此功能 here
如果您查看 public/app/app-routes.js
,您会看到我已将解析函数添加为变量,那么您可以简单地执行此操作,而不是每次都编写一个完整的函数:
函数
var checkLoggedIn = function($q, $timeout, $http, $window, $location, $rootScope) {
// Initialize a new promise
var deferred = $q.defer();
// Make an AJAX call to check if the user is logged in
$http.get('/loggedin').success(function(user) {
// Authenticated
if (user !== '0') {
$rootScope.loggedInUser = user;
$window.sessionStorage['loggedInUser'] = JSON.stringify(user);
deferred.resolve();
}
// Not Authenticated
else {
$window.sessionStorage['loggedInUser'] = null;
$rootScope.loggedInUser = null;
deferred.reject();
$location.url('/login');
}
});
return deferred.promise;
};
checkLoggedIn.$inject = ["$q", "$timeout", "$http", "$window", "$location", "$rootScope"];
路线
.when('/profile', {
title: 'Profile',
templateUrl: '/app/templates/profile.html',
controller: 'ProfileController',
resolve: {
loggedIn: checkLoggedIn
}
})
应该很容易适应您的应用。希望对您有所帮助!
我在 angularjs 中使用路由解析器,因为如果用户未按如下方式登录,用户将被重定向到登录,
$routeProvider
.when('/', {
templateUrl: 'app/components/main/dashboard.html',
controller: 'dashboardController',
resolve: {
login: function ($rootScope, $location) {
if (!$rootScope.currentUser) {
$location.path('/login');
}
}
}
})
这里我想在其他许多路由中使用这个登录功能,所以我可以复制粘贴相同的解析功能到每个地方,如下所示,
.when('/items', {
templateUrl: 'app/components/item/list.html',
controller: 'itemController',
resolve: {
login: function ($rootScope, $location) {
if (!$rootScope.currentUser) {
$location.path('/login');
}
}
}
})
它工作正常,我的问题是,有什么办法可以避免这种代码重复,或者还有其他更好的方法吗?
我昨天建立了一个 github 存储库,它是网络应用程序的起点,包含此功能 here
如果您查看 public/app/app-routes.js
,您会看到我已将解析函数添加为变量,那么您可以简单地执行此操作,而不是每次都编写一个完整的函数:
函数
var checkLoggedIn = function($q, $timeout, $http, $window, $location, $rootScope) {
// Initialize a new promise
var deferred = $q.defer();
// Make an AJAX call to check if the user is logged in
$http.get('/loggedin').success(function(user) {
// Authenticated
if (user !== '0') {
$rootScope.loggedInUser = user;
$window.sessionStorage['loggedInUser'] = JSON.stringify(user);
deferred.resolve();
}
// Not Authenticated
else {
$window.sessionStorage['loggedInUser'] = null;
$rootScope.loggedInUser = null;
deferred.reject();
$location.url('/login');
}
});
return deferred.promise;
};
checkLoggedIn.$inject = ["$q", "$timeout", "$http", "$window", "$location", "$rootScope"];
路线
.when('/profile', {
title: 'Profile',
templateUrl: '/app/templates/profile.html',
controller: 'ProfileController',
resolve: {
loggedIn: checkLoggedIn
}
})
应该很容易适应您的应用。希望对您有所帮助!