Пропустить объект как параметр в $state.go
Я хочу перейти к другому состоянию/экрану и передать простой 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. Я использую ионную структуру на основе angular.
Спасибо, что указали мне в правильном направлении!
Ответы
Ответ 1
Разделить объект на 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);
Здесь full doc
Edit:
Существует несколько способов передать объект в контроллер из URL:
Через параметры запроса:
определить параметры url: '/yoururl?a&b&c'
,
pass variables yoururl?a=1&b=2&c=3
Через URL-параметры:
определить параметры url: '/yoururl/:a/:b/:c',
pass variables yoururl/1/2/3
Для более сложных ситуаций вы можете проанализировать свой объект на json string и закодировать его с помощью base64
Объект: { a:1, b:2, c:3 }
JSON String: {"a":1,"b":2,"c":3}
Base64 Кодированная строка: eyJhIjoxLCJiIjoyLCJjIjozfQ==
определить параметры url: '/yoururl?params'
pass variables yoururl?params=eyJhIjoxLCJiIjoyLCJjIjozfQ==
Подробнее о base64
Ответ 2
Ваш $stage.go должен быть исправлен следующим образом
var benefit = { "x": "y"};
$state.go('pages.claimed', { benefit: benefit });
Ответ 3
Я не уверен, что вы делаете, но если вам нужно обмениваться информацией между двумя контроллерами, вы должны использовать какой-то сервис, а не передавать кучу данных через URL. URL-адрес должен передавать параметры вокруг, чтобы идентифицировать состояние, а не быть средством транспортировки данных.
Вероятно, вам понадобится factory. Здесь небольшая служба регистрации преимуществ... при условии подчеркивания.
.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" .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-адреса, только то, что вам нужно для определения состояния. Вы также запутали механизм хранения, поэтому можете использовать объект, локальное хранилище или любой синхронный механизм хранения, который вам нужен.
У вас также есть услуга, которую вы можете вводить и использовать в другом месте через приложение.
Ответ 4
Очень чистое решение:
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});
Ответ 5
Похоже, вы пропустили "данные" параметра в своем состоянии:
.state('pages.claimed', {
url: '/claimed',
views: {
'page': {
templateUrl: 'templates/pages/claimed.html'
}
},
data: {
benefit: {}
}
})
Вот описание документация