Apakah ada cara untuk mendapatkan status sebelumnya dari kondisi saat ini?
Misalnya saya ingin tahu apa keadaan sebelumnya sebelum keadaan saat ini B (di mana keadaan sebelumnya adalah keadaan A).
Saya tidak dapat menemukannya di halaman doc ui-router github.
Jawaban:
ui-router tidak melacak keadaan sebelumnya setelah transisi, tetapi acara
$stateChangeSuccess
disiarkan pada$rootScope
saat keadaan berubah.Anda harus dapat mengetahui keadaan sebelumnya dari peristiwa itu (
from
apakah Anda akan pergi):sumber
Saya menggunakan tekad untuk menyimpan data status saat ini sebelum pindah ke status baru:
sumber
$stateChangeSuccess
$stateChangeSuccess
bekerja, ia melakukannya di tingkat global, yang sebenarnya tidak terlalu dibutuhkan.$state.current
adalah objek:{name: "", url: "^", views: null, abstract: true}
.Demi keterbacaan, saya akan menempatkan solusi saya (berdasarkan stu.salsbury's anwser) di sini.
Tambahkan kode ini ke templat abstrak aplikasi Anda sehingga itu berjalan di setiap halaman.
Melacak perubahan di rootScope. Cukup praktis.
sumber
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
danappSettings
: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
danappSettings.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:$state.current.name
$state.previous.route.name
Dari konsol Chrome:
Penerapan:
(Saya menggunakan
angular-ui-router v0.2.17
danangularjs v1.4.9
)sumber
Tambahkan properti baru yang disebut {sebelumnya} ke $ state di $ stateChangeStart
Sekarang di mana saja Anda perlu dapat menggunakan $ state yang sebelumnya Anda miliki
Dan gunakan seperti ini:
sumber
Saya terjebak dengan masalah yang sama dan menemukan cara termudah untuk melakukan ini ...
ATAU
(Jika Anda ingin lebih bisa diuji, masukkan layanan $ window ke controller Anda dan gunakan $ window.history.back ()).
sumber
Saya menggunakan pendekatan yang mirip dengan apa yang dilakukan Endy Tjahjono.
Apa yang saya lakukan adalah menyimpan nilai kondisi saat ini sebelum melakukan transisi. Mari kita lihat pada contoh; bayangkan ini di dalam suatu fungsi yang dieksekusi ketika melakukan cliking pada apa pun yang memicu transisi:
Kuncinya di sini adalah objek params (peta parameter yang akan dikirim ke negara) ->
{ previousState : { name : $state.current.name } }
Catatan: perhatikan bahwa saya hanya "menyimpan" atribut nama objek $ state, karena satu-satunya yang saya perlukan untuk menyimpan state. Tapi kita bisa memiliki objek seluruh negara.
Kemudian, sebutkan "apa pun" yang didefinisikan seperti ini:
Di sini, titik kuncinya adalah objek params.
Kemudian, di dalam keadaan itu, kita bisa mendapatkan keadaan sebelumnya seperti ini:
sumber
Berikut ini adalah solusi yang benar-benar elegan dari Chris Thielen ui-router-ekstra: $ priorState
previous
adalah objek yang terlihat seperti:{ state: fromState, params: fromParams }
where fromState adalah status sebelumnya dan fromParams adalah parameter status sebelumnya.sumber
Ok, saya tahu bahwa saya terlambat ke pesta di sini, tetapi saya baru untuk bersudut. Saya mencoba menjadikan ini cocok dengan panduan gaya John Papa di sini. Saya ingin membuat ini dapat digunakan kembali, jadi saya buat di blok. Inilah yang saya pikirkan:
Penyedia Negara sebelumnya
core.module
core.config
Setiap kritik pada kode ini hanya akan membantu saya, jadi tolong beri tahu saya di mana saya dapat meningkatkan kode ini.
sumber
Jika Anda hanya memerlukan fungsi ini dan ingin menggunakannya di lebih dari satu pengontrol, ini adalah layanan sederhana untuk melacak riwayat rute:
di mana 'core' di .module ('core') akan menjadi nama aplikasi / modul Anda. Membutuhkan layanan sebagai ketergantungan pada controller Anda, maka di controller Anda Anda dapat melakukan:
$scope.routeHistory = RouterTracker.getRouteHistory()
sumber
Saya melacak status sebelumnya di $ rootScope , jadi kapan pun saya membutuhkan, saya hanya akan memanggil baris kode di bawah ini.
Di App.js :
sumber
Untuk UI-Router (> = 1.0), acara StateChange telah ditinggalkan. Untuk panduan migrasi lengkap, klik di sini
Untuk mendapatkan status sebelumnya dari kondisi saat ini di UI-Router 1.0+:
sumber
Solusi yang sangat sederhana adalah hanya mengedit string $ state.current.name dan memotong semuanya termasuk dan setelah yang terakhir '.' - Anda mendapatkan nama negara induk. Ini tidak berfungsi jika Anda melompat banyak antar negara karena hanya mem-parsing kembali jalur saat ini. Tetapi jika negara Anda sesuai dengan tempat Anda sebenarnya, maka ini berfungsi.
sumber
$state.go('^')
akan mencapai iniAnda dapat mengembalikan negara dengan cara ini:
Sebuah contoh:
sumber