Ich muss zwei Parameter an den Zustand übergeben und empfangen, in den ich wechseln möchte ui-sref
von ui-router.
Verwenden Sie zum Beispiel den folgenden Link, um den Status zu ändern home
mit foo
und bar
Parameter:
<a ui-sref="home({foo: 'fooVal', bar: 'barVal'})">Go to home state with foo and bar parameters </a>
Empfang foo
und bar
Werte in einem Controller:
app.controller('SomeController', function($scope, $stateParam) {
//..
var foo = $stateParam.foo; //getting fooVal
var bar = $stateParam.bar; //getting barVal
//..
});
Ich bekomme undefined
zum $stateParam
im Steuergerät.
Könnte mir jemand helfen zu verstehen, wie man das hinbekommt?
Bearbeiten:
.state('home', {
url: "https://stackoverflow.com/",
views: {
'': {
templateUrl: 'home.html',
controller: 'MainRootCtrl'
},
'A@home': {
templateUrl: 'a.html',
controller: 'MainCtrl'
},
'B@home': {
templateUrl: 'b.html',
controller: 'SomeController'
}
}
});
Ich habe eine erstellt Beispiel zu zeigen, wie es geht. Aktualisiert state
Definition wäre:
$stateProvider
.state('home', {
url: '/:foo?bar',
views: {
'': {
templateUrl: 'tpl.home.html',
controller: 'MainRootCtrl'
},
...
}
Und das wäre der Controller:
.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;
})
Was wir sehen können, ist, dass das State Home jetzt eine URL hat, die wie folgt definiert ist:
url: '/:foo?bar',
was bedeutet, dass die Parameter in der URL als erwartet werden
/fooVal?bar=barValue
Diese beiden Links übergeben Argumente korrekt an den Controller:
<a ui-sref="home({foo: 'fooVal1', bar: 'barVal1'})">
<a ui-sref="home({foo: 'fooVal2', bar: 'barVal2'})">
Außerdem verbraucht der Controller $stateParams
Anstatt von $stateParam
.
Link zum Dokument:
Du kannst es überprüfen hier
params : {}
Es gibt auch Neugranularere Einstellung params : {}
. Wie wir bereits gesehen haben, können wir Parameter als Teil von deklarieren url
. Aber mit params : {}
Konfiguration – wir können diese Definition erweitern oder sogar Parameter einführen, die nicht Teil der URL sind:
.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',
},
...
Die für Parameter verfügbaren Einstellungen sind in der Dokumentation des beschrieben $stateProvider
Nachfolgend nur ein Auszug
- Wert – {Objekt|Funktion=}: gibt den Standardwert für diesen Parameter an. Dadurch wird dieser Parameter implizit als optional festgelegt …
- Array – {boolesch=}: (Standard: false) Wenn true, wird der Parameterwert als Array von Werten behandelt.
- squash – {bool|string=}: squash konfiguriert, wie ein Standardparameterwert in der URL dargestellt wird, wenn der aktuelle Parameterwert mit dem Standardwert identisch ist.
Wir können diese Parameter so nennen:
// 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]})">
Überprüfen Sie es in Aktion hier
Du hast einfach falsch geschrieben $stateParam
es sollte sein $stateParams
(mit einem s). Deshalb wirst du undefiniert 😉
Sie müssen sie auch in Ihren Routen einrichten. ex:-
url:'.../home/:foo/:bar
– PSL
3. September 2014 um 14:51 Uhr
@PSL: Könntest du hier nur ein kleines Beispiel geben? Vielen Dank.
– überspringen
3. September 2014 um 14:55 Uhr
@PSL: Danke PSL, gibt es eine andere Möglichkeit, diese Parameter mit ihren Werten in einem Controller zu haben?
– überspringen
3. September 2014 um 15:01 Uhr
Tun
'/:foo/:bar': {
in Ihrer leeren Route oder Sie können sie auch als Abfragezeichenfolge einrichten.– PSL
3. September 2014 um 15:01 Uhr