Dengan ui-router
, dimungkinkan untuk menyuntikkan salah satu $state
atau $stateParams
ke pengontrol untuk mendapatkan akses ke parameter di URL. Namun, mengakses parameter melalui $stateParams
hanya mengekspos parameter milik negara yang dikelola oleh pengontrol yang mengaksesnya, dan status induknya, sementara $state.params
memiliki semua parameter, termasuk yang ada di status turunan apa pun.
Diberikan kode berikut, jika kita langsung memuat URL http://path/1/paramA/paramB
, begini jadinya ketika pengontrol memuat:
$stateProvider.state('a', {
url: 'path/:id/:anotherParam/',
controller: 'ACtrl',
});
$stateProvider.state('a.b', {
url: '/:yetAnotherParam',
controller: 'ABCtrl',
});
module.controller('ACtrl', function($stateParams, $state) {
$state.params; // has id, anotherParam, and yetAnotherParam
$stateParams; // has id and anotherParam
}
module.controller('ABCtrl', function($stateParams, $state) {
$state.params; // has id, anotherParam, and yetAnotherParam
$stateParams; // has id, anotherParam, and yetAnotherParam
}
Pertanyaannya adalah, mengapa berbeda? Dan apakah ada pedoman praktik terbaik tentang kapan dan mengapa Anda harus menggunakan, atau menghindari penggunaan salah satunya?
angularjs
angular-ui-router
Merott
sumber
sumber
Jawaban:
Dokumentasi mengulangi temuan Anda di sini: https://github.com/angular-ui/ui-router/wiki/URL-Routing#stateparams-service
Jika ingatan saya berfungsi,
$stateParams
diperkenalkan lebih lambat dari aslinya$state.params
, dan tampaknya menjadi injektor pembantu sederhana untuk menghindari terus menulis$state.params
.Saya ragu ada pedoman praktik terbaik, tetapi konteks menang bagi saya. Jika Anda hanya ingin akses ke params yang diterima ke dalam url, gunakan
$stateParams
. Jika Anda ingin mengetahui sesuatu yang lebih kompleks tentang negara bagian itu sendiri, gunakan$state
.sumber
$state.params
inACtrl
, karena saya ingin memeriksa apakahyetAnotherParam
sudah disetel. Jadi jika tidak, saya bisa melakukan sesuatu. Saya tidak akan menjelaskan secara rinci sesuatu itu karena hal itu dapat menjamin pertanyaannya sendiri. Namun, saya merasa saya mungkin melakukan peretasan dengan memeriksa parameter yang diperkenalkan oleh status anak dan tidak dikenali oleh status saat ini melalui$stateParams
. Saya telah menemukan pendekatan alternatif sejak itu.parent.child
, maka$stateParams
inparentController
akan mengevaluasi parameter berbasis urlparent
, tetapi bukan parameterparent.child
. Lihat masalah ini .$stateParams
bekerja dalam penyelesaian, sementara$state.params
tidak benar (tidak menampilkan parameter untuk negara yang belum diselesaikan)Alasan lain untuk menggunakan
$state.params
adalah untuk negara berbasis non-URL, yang (menurut saya) sangat kekurangan dokumen dan sangat kuat.Saya baru saja menemukan ini saat mencari di Google tentang cara menyampaikan status tanpa harus mengeksposnya di URL dan menjawab pertanyaan di tempat lain di SO.
Pada dasarnya, ini memungkinkan sintaks semacam ini:
sumber
EDIT: Jawaban ini benar untuk versi
0.2.10
. Seperti yang ditunjukkan @Alexander Vasilyev, ini tidak berfungsi dalam versi0.2.14
.Alasan lain untuk menggunakan
$state.params
adalah saat Anda perlu mengekstrak parameter kueri seperti ini:sumber
Ada banyak perbedaan di antara keduanya. Tetapi saat bekerja secara praktis saya telah menemukan bahwa menggunakan
$state.params
lebih baik. Saat Anda menggunakan lebih banyak parameter, ini mungkin membingungkan untuk dipertahankan$stateParams
. dimana jika kita menggunakan beberapa param yang bukan$state
merupakan parameter URL sangat bergunasumber
Saya memiliki status root yang menyelesaikan sth. Meneruskan
$state
sebagai parameter penyelesaian tidak akan menjamin ketersediaan untuk$state.params
. Tapi menggunakan$stateParams
kemauan.Menggunakan "angular": "~ 1.4.0", "angular-ui-router": "~ 0.2.15"
sumber
Pengamatan menarik yang saya buat saat melewati parameter status sebelumnya dari satu rute ke rute lainnya adalah bahwa $ stateParams akan diangkat dan menimpa parameter status rute sebelumnya yang diteruskan dengan parameter status saat ini, tetapi menggunakan
$state.param
s tidak.Saat menggunakan
$stateParams
:Saat menggunakan $ state.params:
sumber
Di sini, di artikel ini dijelaskan dengan jelas:
$state
Layanan menyediakan sejumlah metode yang berguna untuk memanipulasi status serta data terkait pada status saat ini. Parameter status saat ini dapat diakses pada$state
layanan di kunci params. The$stateParams
layanan mengembalikan objek yang sama ini. Oleh karena itu,$stateParams
layanan ini benar-benar merupakan layanan kenyamanan untuk mengakses objek params pada$state
layanan dengan cepat.Dengan demikian, tidak ada pengontrol yang boleh menyuntikkan
$state
layanan dan layanan kenyamanannya$stateParams
,. Jika$state
disuntikkan hanya untuk mengakses parameter saat ini, pengontrol harus ditulis ulang untuk menyuntikkan$stateParams
sebagai gantinya.sumber