Ui-routerのui-sref
を使って遷移したい状態に2つのパラメータを渡して受け取る必要があります。
以下のリンクを使用して、home
およびfoo
パラメータを使用して状態をbar
に移行します。
<a ui-sref="home({foo: 'fooVal', bar: 'barVal'})">Go to home state with foo and bar parameters </a>
コントローラでfoo
とbar
の値を受け取る:
app.controller('SomeController', function($scope, $stateParam) {
//..
var foo = $stateParam.foo; //getting fooVal
var bar = $stateParam.bar; //getting barVal
//..
});
コントローラ内で$stateParam
に対してundefined
を取得します。
誰かが私がそれを成し遂げる方法を理解するのを手伝ってくれる?
編集:
.state('home', {
url: '/',
views: {
'': {
templateUrl: 'home.html',
controller: 'MainRootCtrl'
},
'A@home': {
templateUrl: 'a.html',
controller: 'MainCtrl'
},
'B@home': {
templateUrl: 'b.html',
controller: 'SomeController'
}
}
});
方法を示すために example を作成しました。更新されたstate
の定義は次のようになります。
$stateProvider
.state('home', {
url: '/:foo?bar',
views: {
'': {
templateUrl: 'tpl.home.html',
controller: 'MainRootCtrl'
},
...
}
そしてこれはコントローラになります:
.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;
})
私たちが見ることができるのは、州の家が今では次のように定義されたURLを持っているということです。
url: '/:foo?bar',
つまり、urlの中のパラメータは、
/fooVal?bar=barValue
これら2つのリンクは、引数を正しくコントローラーに渡します。
<a ui-sref="home({foo: 'fooVal1', bar: 'barVal1'})">
<a ui-sref="home({foo: 'fooVal2', bar: 'barVal2'})">
また、コントローラは$stateParams
の代わりに$stateParam
を消費します。
Docへのリンク:
確認できます ここ
params : {}
new、よりきめ細かい設定params : {}
もあります。すでに見たように、パラメータはurl
の一部として宣言できます。しかしparams : {}
設定で - 私たちはこの定義を拡張するか、あるいは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',
},
...
Paramsに利用可能な設定は $ stateProvider のドキュメントに記述されています。
以下は抜粋です
このようにしてこれらのパラメータを呼び出すことができます。
// 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]})">
実際に確認してください ここ
必ずしもURLの中にパラメータを含める必要はありません。
例えば、
$stateProvider
.state('home', {
url: '/',
views: {
'': {
templateUrl: 'home.html',
controller: 'MainRootCtrl'
},
},
params: {
foo: null,
bar: null
}
})
次のいずれかを使用して、状態にパラメータを送信することができます。
$state.go('home', {foo: true, bar: 1});
// or
<a ui-sref="home({foo: true, bar: 1})">Go!</a>
もちろん、home
状態でページを1回リロードすると、stateパラメータはどこにも格納されていないため、状態パラメータが失われます。
この振る舞いの詳細な説明は、state(name, stateConfig)
セクションのparams
行の下の here に文書化されています。
$stateParam
のスペルを間違えただけで、$stateParams
(s付き)になります。それがあなたが未定義になる理由です;)