Jak przekazać parametry za pomocą UI-sref w Ui-routerze do kontrolera
Muszę przekazać i otrzymać dwa parametry do stanu, do którego chcę przejść używając ui-sref
ui-routera.
Coś takiego jak użycie poniższego linku do przejścia stanu do home
z parametrami foo
i bar
:
<a ui-sref="home({foo: 'fooVal', bar: 'barVal'})">Go to home state with foo and bar parameters </a>
Otrzymywanie wartości foo
i bar
w kontrolerze:
app.controller('SomeController', function($scope, $stateParam) {
//..
var foo = $stateParam.foo; //getting fooVal
var bar = $stateParam.bar; //getting barVal
//..
});
Dostaję undefined
za $stateParam
w kontrolerze.
Edit:
.state('home', {
url: '/',
views: {
'': {
templateUrl: 'home.html',
controller: 'MainRootCtrl'
},
'A@home': {
templateUrl: 'a.html',
controller: 'MainCtrl'
},
'B@home': {
templateUrl: 'b.html',
controller: 'SomeController'
}
}
});
3 answers
Stworzyłem przykład , aby pokazać, jak to zrobić. Zaktualizowana definicja {[7] } będzie brzmiała:
$stateProvider
.state('home', {
url: '/:foo?bar',
views: {
'': {
templateUrl: 'tpl.home.html',
controller: 'MainRootCtrl'
},
...
}
A to będzie kontroler:
.controller('MainRootCtrl', function($scope, $state, $stateParams) {
//..
var foo = $stateParams.foo; //getting fooVal
var bar = $stateParams.bar; //getting barVal
//..
$scope.state = $state.current
$scope.params = $stateParams;
})
Widzimy, że dom stanu ma teraz adres URL zdefiniowany jako:
url: '/:foo?bar',
Co oznacza, że paramy w url są oczekiwane jako
/fooVal?bar=barValue
Te dwa linki będą poprawnie przekazywać argumenty do kontrolera:
<a ui-sref="home({foo: 'fooVal1', bar: 'barVal1'})">
<a ui-sref="home({foo: 'fooVal2', bar: 'barVal2'})">
Ponadto kontroler zużywa $stateParams
zamiast $stateParam
.
Link do doc:
Możesz to sprawdzić tutaj
params : {}
Istnieje również nowe , bardziej ziarniste ustawienie params : {}
. Jak już widzieliśmy, możemy zadeklarować parametry jako część url
. Ale z konfiguracją params : {}
- możemy rozszerzyć tę definicję lub nawet wprowadzić paramtery, które nie są częścią adresu url:
.state('other', {
url: '/other/:foo?bar',
params: {
// here we define default value for foo
// we also set squash to false, to force injecting
// even the default value into url
foo: {
value: 'defaultValue',
squash: false,
},
// this parameter is now array
// we can pass more items, and expect them as []
bar : {
array : true,
},
// this param is not part of url
// it could be passed with $state.go or ui-sref
hiddenParam: 'YES',
},
...
Ustawienia dostępne dla param są opisane w dokumentacji z $stateProvider
Poniżej jest tylko wyciąg
- value - {object / function=} : określa domyślną wartość dla tego parametru. Domyślnie ustawia ten parametr jako opcjonalny...
- array - {boolean=}: (domyślnie: false) jeśli true, wartość param będzie traktowana jako tablica wartości.
- squash - {bool|string=}: squash konfiguruje sposób reprezentacji domyślnej wartości parametru w adresie URL, gdy bieżąca wartość parametru jest taka sama jak wartość domyślna.
Możemy nazwać te paramy w ten sposób:
// hidden param cannot be passed via url
<a href="#/other/fooVal?bar=1&bar=2">
// default foo is skipped
<a ui-sref="other({bar: [4,5]})">
Sprawdź w akcji tutaj
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-11 18:56:18
Niekoniecznie musisz mieć parametry wewnątrz adresu URL.
Na przykład z:
$stateProvider
.state('home', {
url: '/',
views: {
'': {
templateUrl: 'home.html',
controller: 'MainRootCtrl'
},
},
params: {
foo: null,
bar: null
}
})
Będziesz mógł wysłać parametry do stanu, używając:
$state.go('home', {foo: true, bar: 1});
// or
<a ui-sref="home({foo: true, bar: 1})">Go!</a>
Oczywiście, jeśli przeładujesz stronę raz na stanie home
, stracisz parametry stanu, ponieważ nigdzie nie są przechowywane.
Pełny opis tego zachowania jest udokumentowany tutaj, w wierszu params
w sekcji state(name, stateConfig)
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-22 11:42:47
Po prostu źle napisałeś $stateParam
, powinno być $stateParams
(przez s). Dlatego dostajesz undefined;)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-10 13:32:46