別の状態/画面に移動し、この次の画面に単純なjsonオブジェクトを渡したいです。
私は次のものを持っています:
var benefit = { "x": "y"};
$state.go('pages.claimed', { 'benefit': benefit });
私の状態は次のようになります。
.state('pages.claimed', {
url: '/claimed',
views: {
'page': {
templateUrl: 'templates/pages/claimed.html'
}
}
})
ただし、pages.claimedビューの「利点」オブジェクト/パラメーターにアクセスできません。角度に基づいたionicフレームワークを使用しています。
私を正しい方向に向けてくれてありがとう!
jsonへのオブジェクトの解析:
var benefit = angular.toJson({ "x": "y"});
状態パラメーターの変数の定義:
.state('pages.claimed', {
url: '/claimed?params',
views: {
'page': {
templateUrl: 'templates/pages/claimed.html'
}
}
})
を介したコントローラーから変数へのアクセス$stateParams
:
var benefit = angular.fromJson($stateParams.benefit);
ここ 完全なドキュメント
編集:
URLからコントローラーにオブジェクトを渡す方法はいくつかあります。
クエリパラメータを使用:
オプションの定義url: '/yoururl?a&b&c'
、
変数を渡すyoururl?a=1&b=2&c=3
Via url params:
オプションの定義url: '/yoururl/:a/:b/:c',
変数を渡すyoururl/1/2/3
より複雑な状況では、オブジェクトをjson文字列に解析し、base64でエンコードできます
オブジェクト:{ a:1, b:2, c:3 }
JSON文字列:{"a":1,"b":2,"c":3}
Base64エンコード文字列:eyJhIjoxLCJiIjoyLCJjIjozfQ==
オプションの定義url: '/yoururl?params'
変数を渡すyoururl?params=eyJhIjoxLCJiIjoyLCJjIjozfQ==
その他 base64に関する情報
$ state.goはこのように修正する必要があります
var benefit = { "x": "y"};
$state.go('pages.claimed', { benefit: benefit });
.stateは次のようになります
.state('pages.claimed', {
url: '/claimed',
params: { benefit: null },
views: {
'page': {
templateUrl: 'templates/pages/claimed.html'
}
}
})
次のコントローラーで、渡されたオブジェクトを次のようにキャッチします
(function () {
'use strict';
angular.module('YourAppName').controller('ControllerName', ['$stateParams', ControllerName]);
function ControllerName($stateParams) {
var vm = this;
vm.variableToBind = $stateParams.benefit;
};
})();
非常にきれいなソリューション:
app.js:
$stateProvider.state('users', {
url: '/users',
controller: 'UsersCtrl',
params: { obj: null }
})
controllers.js
function UserCtrl($stateParams) {
console.log($stateParams);
}
次に、他のコントローラーから:
$state.go('users', {obj:yourObj});
アプリケーションが何をしているのかわかりませんが、2つのコントローラー間で情報を共有する必要がある場合は、URL経由で大量のデータを渡さずに、何らかのサービスを使用する必要があります。 URLは、データ転送の手段ではなく、状態を識別するためにパラメーターを渡すことです。
おそらく、何らかの工場が必要になるでしょう。アンダースコアを想定した、ちょっとした特典登録サービスです。
.factory('benefitsService', ['_', function(_){
function BenefitsService(){
this.benefits = [{
id: 'benefit1',
x: 100,
y: 200
},{
id: 'benefit2',
x: 200,
y: 300
}];
}
// use this to register new benefits from a controller, other factory, wherever.
BenefitsService.prototype.addBenefit = function(benefit){
this.benefits.Push(benefits);
}
BenefitsService.prototype.findById = function(id){
return _.findWhere(this.benefits, {id: id});
}
return new BenefitsService();
}]);
.run(['benefitsService', function(benefitsService){
// we're going to register another benefit here to show usage....
benefitsService.addBenefit({
id: 'addedBenefit',
x: 2000,
y: 4000
});
}])
次に、URLを介して通常の「/ url /:id」にidを渡すだけです。controller( 'firstController'、['$ state'、function($ state){$ state.go( 'stateId'、{id: 'addedBenefit'});});
//そして、注入されたサービスを使用してデータを見つけます。
.controller('secondController', ['$state', 'benefitService', function($state, benefitService){
var benefit = benefitService.findById($state.params.id);
// and you're home!
}]);
この方法では、状態を特定するために必要なものだけが、URLの中に大量に残されます。また、ストレージメカニズムを難読化したため、オブジェクト、ローカルストレージ、または任意の同期ストレージメカニズムを使用できます。
また、アプリケーションを介して他の場所に注入して使用できるサービスもあります。
あなたの状態でパラメータ「データ」を見逃したように見えます:
.state('pages.claimed', {
url: '/claimed',
views: {
'page': {
templateUrl: 'templates/pages/claimed.html'
}
},
data: {
benefit: {}
}
})
ドキュメント からの説明です