Подтвердить что ты не робот

Пропустить объект как параметр в $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.

Спасибо, что указали мне в правильном направлении!

4b9b3361

Ответ 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: {}
    }
  })

Вот описание документация