Za pomocą ui-router
można wstrzyknąć kontroler $state
lub $stateParams
do kontrolera, aby uzyskać dostęp do parametrów w adresie URL. Jednak dostęp do parametrów za pośrednictwem $stateParams
ujawnia tylko parametry należące do stanu zarządzanego przez kontroler, który uzyskuje do niego dostęp, oraz jego stany nadrzędne, podczas gdy $state.params
ma wszystkie parametry, w tym te w stanach potomnych.
Biorąc pod uwagę następujący kod, jeśli bezpośrednio załadujemy adres URL http://path/1/paramA/paramB
, wygląda to tak, gdy ładują się kontrolery:
$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
}
Pytanie brzmi, skąd ta różnica? Czy istnieją wskazówki dotyczące najlepszych praktyk dotyczące tego, kiedy i dlaczego należy ich używać lub unikać?
angularjs
angular-ui-router
Merott
źródło
źródło
Odpowiedzi:
Dokumentacja powtarza twoje ustalenia tutaj: https://github.com/angular-ui/ui-router/wiki/URL-Routing#stateparams-service
Jeśli moja pamięć służy,
$stateParams
została wprowadzona później niż oryginał$state.params
i wydaje się być prostym wtryskiwaczem pomocniczym, aby uniknąć ciągłego pisania$state.params
.Wątpię, czy istnieją jakieś wskazówki dotyczące najlepszych praktyk, ale kontekst wygrywa dla mnie. Jeśli po prostu chcesz uzyskać dostęp do parametrów otrzymanych w adresie URL, użyj
$stateParams
. Jeśli chcesz dowiedzieć się czegoś bardziej złożonego o samym stanie, użyj$state
.źródło
$state.params
wACtrl
grze, bo chciałem sprawdzić czyyetAnotherParam
jest ustawione. Więc jeśli tak nie jest, mogę coś zrobić. Nie wchodzę w szczegóły tego czegoś, ponieważ mogłoby to uzasadniać pytanie samo w sobie. Jednak wydaje mi się, że mogę robić hackowanie , sprawdzając parametr, który jest wprowadzany przez stan potomny i nie jest rozpoznawany przez bieżący stan do$stateParams
. Od tego czasu znalazłem alternatywne podejście.parent.child
, i nie oparte na adresach URL . Jeśli jesteś w stanie , program$stateParams
inparentController
oceni parametry oparte na adresach URLparent
, ale nie te zparent.child
. Zobacz ten numer .$stateParams
działa w rozwiązaniu, podczas gdy$state.params
jest niepoprawne (nie pokazuje parametrów stanu, który nie został jeszcze rozwiązany)Innym powodem do użycia
$state.params
jest stan nie oparty na adresie URL, który (moim zdaniem) jest żałośnie nieudokumentowany i bardzo potężny.Właśnie odkryłem to podczas wyszukiwania w Google, jak przekazać stan bez konieczności ujawniania go w adresie URL i odpowiedziałem na pytanie w innym miejscu na SO.
Zasadniczo pozwala na ten rodzaj składni:
źródło
EDYCJA: Ta odpowiedź jest poprawna dla wersji
0.2.10
. Jak zauważył @Alexander Vasilyev, nie działa w wersji0.2.14
.Innym powodem do użycia
$state.params
jest wyodrębnienie parametrów zapytania w następujący sposób:źródło
Istnieje wiele różnic między tymi dwoma. Ale pracując praktycznie, przekonałem się, że
$state.params
lepiej. Gdy używasz coraz większej liczby parametrów, może to być kłopotliwe w utrzymaniu$stateParams
. gdzie jeśli używamy wielu parametrów, które nie są parametrami adresu URL,$state
jest to bardzo przydatneźródło
Mam stan root, który rozwiązuje coś. Przekazanie
$state
jako parametru rozpoznawania nie gwarantuje dostępności dla$state.params
. Ale używając$stateParams
woli.Korzystanie z „kątowego”: „~ 1,4.0”, „angular-ui-router”: „~ 0,2,15”
źródło
Ciekawą obserwacją, jaką poczyniłem podczas przekazywania poprzednich parametrów stanu z jednej trasy do drugiej, jest to, że $ stateParams zostaje podniesione i nadpisuje parametry stanu poprzedniej trasy, które zostały przekazane z bieżącymi parametrami stanu, ale użycie
$state.param
s nie.Podczas używania
$stateParams
:Używając $ state.params:
źródło
Tutaj w tym artykule jest wyraźnie wyjaśnione: the
$state
serwis oferuje szereg przydatnych metod manipulowania stan, a także istotne dane na temat aktualnego stanu. Aktualne parametry stanu są dostępne w$state
usłudze pod kluczem params.$stateParams
Usługa zwraca ten bardzo sam obiekt. W związku z tym$stateParams
usługa jest usługą ściśle wygodną, polegającą na szybkim dostępie do obiektu parametrów w$state
usłudze.W związku z tym żaden kontroler nie powinien nigdy wstrzykiwać zarówno
$state
usługi, jak i jej wygodnej usługi$stateParams
. Jeśli$state
jest wstrzykiwany tylko po to, aby uzyskać dostęp do bieżących parametrów, kontroler powinien zostać przepisany, aby$stateParams
zamiast tego wstrzykiwać .źródło