Dalam contoh berikut ini saya membuat a decorator
(berjalan hanya sekali per aplikasi pada tahap konfigurasi) dan menambahkan properti tambahan ke $state
layanan, sehingga pendekatan ini tidak menambahkan variabel global$rootscope
dan tidak perlu menambahkan ketergantungan ekstra ke layanan lain selain $state
.
Dalam contoh saya, saya perlu mengarahkan pengguna ke halaman indeks ketika dia sudah masuk dan ketika dia tidak mengarahkannya ke halaman "terlindungi" sebelumnya setelah masuk.
Satu-satunya layanan tidak dikenal (untuk Anda) yang saya gunakan adalah authenticationFactory
dan appSettings
:
authenticationFactory
baru saja mengatur login pengguna. Dalam hal ini saya hanya menggunakan metode untuk mengidentifikasi apakah pengguna masuk atau tidak.
appSettings
adalah konstanta hanya untuk tidak menggunakan string di mana-mana. appSettings.states.login
dan appSettings.states.register
berisi nama negara bagian untuk login dan mendaftar url.
Kemudian di controller
/ service
etc Anda perlu menyuntikkan $state
layanan dan Anda dapat mengakses url saat ini dan sebelumnya seperti ini:
- Arus:
$state.current.name
- Sebelumnya:
$state.previous.route.name
Dari konsol Chrome:
var injector = angular.element(document.body).injector();
var $state = injector.get("$state");
$state.current.name;
$state.previous.route.name;
Penerapan:
(Saya menggunakan angular-ui-router v0.2.17
dan 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);