Trong ví dụ sau tôi đã tạo một decorator
(chỉ chạy một lần cho mỗi ứng dụng ở giai đoạn cấu hình) và thêm một thuộc tính bổ sung cho $state
dịch vụ, vì vậy cách tiếp cận này không thêm các biến toàn cục vào $rootscope
và không yêu cầu thêm bất kỳ phụ thuộc nào vào các dịch vụ khác ngoài $state
.
Trong ví dụ của tôi, tôi cần chuyển hướng người dùng đến trang chỉ mục khi anh ta đã đăng nhập và khi anh ta không chuyển hướng anh ta đến trang "được bảo vệ" trước đó sau khi đăng nhập.
Các dịch vụ không xác định duy nhất (cho bạn) mà tôi sử dụng là authenticationFactory
và appSettings
:
authenticationFactory
chỉ quản trị đăng nhập người dùng. Trong trường hợp này tôi chỉ sử dụng một phương pháp để xác định xem người dùng có đăng nhập hay không.
appSettings
là hằng số chỉ để không sử dụng chuỗi ở khắp mọi nơi. appSettings.states.login
và appSettings.states.register
chứa tên của tiểu bang cho url đăng nhập và đăng ký.
Sau đó, trong bất kỳ controller
/ service
etc bạn cần tiêm $state
dịch vụ và bạn có thể truy cập url hiện tại và trước đó như thế này:
- Hiện hành:
$state.current.name
- Trước:
$state.previous.route.name
Từ bảng điều khiển Chrome:
var injector = angular.element(document.body).injector();
var $state = injector.get("$state");
$state.current.name;
$state.previous.route.name;
Thực hiện:
(Tôi đang sử dụng angular-ui-router v0.2.17
và angularjs v1.4.9
)
(function(angular) {
"use strict";
function $stateDecorator($delegate, $injector, $rootScope, appSettings) {
function decorated$State() {
var $state = $delegate;
$state.previous = undefined;
$rootScope.$on("$stateChangeSuccess", function (ev, to, toParams, from, fromParams) {
$state.previous = { route: from, routeParams: fromParams }
});
$rootScope.$on("$stateChangeStart", function (event, toState/*, toParams, fromState, fromParams*/) {
var authenticationFactory = $injector.get("authenticationFactory");
if ((toState.name === appSettings.states.login || toState.name === appSettings.states.register) && authenticationFactory.isUserLoggedIn()) {
event.preventDefault();
$state.go(appSettings.states.index);
}
});
return $state;
}
return decorated$State();
}
$stateDecorator.$inject = ["$delegate", "$injector", "$rootScope", "appSettings"];
angular
.module("app.core")
.decorator("$state", $stateDecorator);
})(angular);