Apa yang saya coba capai
Saya ingin beralih ke keadaan tertentu (masuk) jika permintaan $ http mengembalikan kesalahan 401. Karena itu saya telah membuat pencegat $ http.
Masalah
Ketika saya mencoba untuk memasukkan '$ state' ke interseptor saya mendapatkan ketergantungan melingkar. Mengapa dan bagaimana cara memperbaikinya?
Kode
//Inside Config function
var interceptor = ['$location', '$q', '$state', function($location, $q, $state) {
function success(response) {
return response;
}
function error(response) {
if(response.status === 401) {
$state.transitionTo('public.login');
return $q.reject(response);
}
else {
return $q.reject(response);
}
}
return function(promise) {
return promise.then(success, error);
}
}];
$httpProvider.responseInterceptors.push(interceptor);
sumber
$injector
layanan ke interseptor Anda dan menelepon di$injector.get()
mana Anda perlu mendapatkan$state
layanan tersebut.$httpProvider.responseInterceptors.push
tidak berfungsi lagi jika Anda menggunakan versi Angular yang lebih baru. Gunakan$httpProvider.interceptors.push()
sebagai gantinya. Anda harus memodifikasiinterceptor
juga. Bagaimanapun, terima kasih atas jawaban yang luar biasa! :)Pertanyaannya adalah duplikat dari AngularJS: Layanan injeksi ke interseptor HTTP (ketergantungan melingkar)
Saya memposting ulang jawaban saya dari utas itu di sini:
Perbaikan yang Lebih Baik
Saya pikir menggunakan $ injektor secara langsung adalah antipattern.
Cara untuk memutus dependensi melingkar adalah dengan menggunakan peristiwa: Daripada memasukkan $ state, injeksikan $ rootScope. Alih-alih mengarahkan langsung, lakukan
plus
Dengan cara itu Anda telah memisahkan kekhawatiran:
sumber
Solusi Jonathan sangat bagus sampai saya mencoba menyelamatkan keadaan saat ini. Di ui-router v0.2.10 , status saat ini tampaknya tidak diisi pada pemuatan halaman awal di interseptor.
Bagaimanapun, saya menyelesaikannya dengan menggunakan acara $ stateChangeError sebagai gantinya. Peristiwa $ stateChangeError memberi Anda status ke dan dari , serta kesalahan. Cukup bagus.
sumber