Saya memiliki negara bagian yang memerlukan otorisasi. Saya mendengarkan acara $stateChangeStart
dan jika toState.data.protected
dan pengguna tidak berwenang, saya memanggil e.preventDefault()
dan $state.go('login')
.
Ketika saya membuka aplikasi di url root, saya secara otomatis dialihkan ke status terlindungi. Hal ini menyebabkan 10 $digest loop dan saya berakhir dalam status login ketika saya membuka aplikasi di url root dan saya secara otomatis dialihkan ke status terlindungi.
Uncaught Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!
Lihat plnkr ini: http://plnkr.co/edit/1voh7m?p=preview
Saya berhasil menggunakan kode serupa di proyek berbeda dengan sudut 1.2.26 tanpa kesalahan.
Contoh kode angular 1.4.1, ui.router 0.2.15
:
//config block
$urlRouterProvider.otherwise('/main');
$stateProvider
.state('main', {
url: '/main',
templateUrl: 'main.html',
controller: 'MainController as main',
data: {'protected': true}
})
.state('login', {
url: '/login',
templateUrl: 'login.html',
controller: 'LoginController as login'
});
// in a run block
$rootScope.$on("$stateChangeStart", function (event, toState) {
if (!event.defaultPrevented && toState.data &&
toState.data.protected) {
// the user is not authorized, do not switch to state
event.preventDefault();
// go to login page
$state.go('login');
}
});
Tahukah Anda apa penyebab loop tersebut?
Saya ingin tahu apakah hal-hal tersebut mungkin terjadi seperti ini:
- Cegat transisi ke status main.submain
- Mulai transisi ke status login
- Router UI mendapat informasi bahwa transisi pertama dibatalkan
- Router UI menjalankan
$urlRouter.update()
dan memulai transisi ke main.submain
EDIT: Konfigurasi status yang disederhanakan.
data: {'protected': true}
pada negara bagian utama. Negara bagian tersebut secara prototipikal diwariskan sehingga negara bagian utama.subutama memiliki nilai yang sama. - person kvetis   schedule 03.07.2015$urlRouterProvider.otherwise('/main');
, karena untuk url lain coba dialihkan ke 'main' dan Anda dalam loop tak terbatas, saya punya sedikit ubah plunker Anda coba periksa: plnkr.co/edit/RyWEusonoBhfQjwD32uu?p=preview sebuah> - person Grundy   schedule 07.07.2015$urlRouterProvider.otherwise('/main');
dengan solusi saya - karena Anda hanya ingin memiliki pengalihan default. Saya suka saran Anda dan saya akan mengirimkan jawabannya sebentar lagi. - person kvetis   schedule 07.07.2015