Ответ 1
Все, что мне нужно было сделать, это добавить параметр в определение состояния URL так:
url: '/toState?referer'
Doh!
Я использую AngularJS v1.2.0-rc.2 с ui-router v0.2.0. Я хочу передать состояние реферера в другое состояние, поэтому я использую toParams
of $state.go
следующим образом:
$state.go('toState', {referer: $state.current.name});
Согласно docs, это должно заполнить $stateParams
на контроллере toState
, но это undefined
. Что мне не хватает?
Я создал панель для демонстрации:
Все, что мне нужно было сделать, это добавить параметр в определение состояния URL так:
url: '/toState?referer'
Doh!
Если вы хотите передать состояние без URL-адреса, тогда вы не должны использовать url
при настройке state
. Я нашел ответ в PR и немного поработал, чтобы лучше понять.
$stateProvider.state('toState', {
templateUrl:'wokka.html',
controller:'stateController',
params: {
'referer': 'some default',
'param2': 'some default',
'etc': 'some default'
}
});
Затем вы можете перейти к нему так:
$state.go('toState', { 'referer':'jimbob', 'param2':37, 'etc':'bluebell' });
Или:
var result = { referer:'jimbob', param2:37, etc:'bluebell' };
$state.go('toState', result);
И в HTML:
<a ui-sref="toState(thingy)" class="list-group-item" ng-repeat="thingy in thingies">{{ thingy.referer }}</a>
Этот пример использования полностью раскрыт в документации, но я считаю это мощным средством перехода состояния без использования URL-адресов.
Решение Nathan Matthews не сработало для меня, но это абсолютно правильно, но есть немного смысла для достижения обходного пути:
Ключевой момент: Тип определенных параметров и toParamas из $state.go должен быть таким же массивом или объектом с обеих сторон перехода состояния.
Например, когда вы определяете параметры в состоянии следующим образом, вы подразумеваете, что params - это массив из-за использования "[]":
$stateProvider
.state('home', {
templateUrl: 'home',
controller: 'homeController'
})
.state('view', {
templateUrl: 'overview',
params: ['index', 'anotherKey'],
controller: 'overviewController'
})
Итак, вы также должны перейти к параметрам в виде массива:
params = { 'index': 123, 'anotherKey': 'This is a test' }
paramsArr = (val for key, val of params)
$state.go('view', paramsArr)
И вы можете получить к ним доступ через $stateParams в виде массива вроде этого:
app.controller('overviewController', function($scope, $stateParams) {
var index = $stateParams[0];
var anotherKey = $stateParams[1];
});
Лучшее решение использует объект вместо массива с обеих сторон:
$stateProvider
.state('home', {
templateUrl: 'home',
controller: 'homeController'
})
.state('view', {
templateUrl: 'overview',
params: {'index': null, 'anotherKey': null},
controller: 'overviewController'
})
Я заменил [] на {} в определении params. Для перехода кParams в $state.go также вы должны использовать объект вместо массива:
$state.go('view', { 'index': 123, 'anotherKey': 'This is a test' })
вы можете легко получить доступ к ним через $stateParams:
app.controller('overviewController', function($scope, $stateParams) {
var index = $stateParams.index;
var anotherKey = $stateParams.anotherKey;
});
Не уверен, что он будет работать с AngularJS v1.2.0-rc.2 с ui-router v0.2.0. Я проверил это решение на AngularJS v1.3.14 с ui-router v0.2.13.
Я просто понимаю, что нет необходимости передавать параметр в URL-адресе, как рекомендует gwhn.
Просто добавьте свои параметры со значением по умолчанию для вашего определения состояния. В вашем состоянии все еще может быть значение Url.
$stateProvider.state('state1', {
url : '/url',
templateUrl : "new.html",
controller : 'TestController',
params: {new_param: null}
});
и добавьте параметр в $state.go()
$state.go('state1',{new_param: "Going places!"});
Ни один из этих примеров на этой странице не работал у меня. Это то, что я использовал, и это сработало хорошо. В некоторых решениях вы не можете комбинировать url с $state.go(), но это неверно. Неловко то, что вы должны определить параметры для URL-адреса, а также перечислить параметры. Оба должны присутствовать. Протестировано на Angular 1.4.8 и UI Router 0.2.15.
В состоянии добавьте свои параметры в конец состояния и определите параметры:
url: 'view?index&anotherKey',
params: {'index': null, 'anotherKey': null}
В вашем контроллере ваш оператор go будет выглядеть следующим образом:
$state.go('view', { 'index': 123, 'anotherKey': 'This is a test' });
Затем вытащите параметры и используйте их в вашем новом контроллере состояния (не забудьте передать в $stateParams функцию контроллера):
var index = $stateParams.index;
var anotherKey = $stateParams.anotherKey;
console.log(anotherKey); //it works!
Я потратил много времени на борьбу с Ionic/ Angular $state и $stateParams;
Чтобы использовать $state.go() и $stateParams, у вас должны быть определенные настройки, а другие параметры не должны присутствовать.
В моем app.config() я включил $stateProvider и определил внутри него несколько состояний:
$stateProvider
.state('home', {
templateUrl: 'home',
controller: 'homeController'
})
.state('view', {
templateUrl: 'overview',
params: ['index', 'anotherKey'],
controller: 'overviewController'
})
Клавиша params
особенно важна. Кроме того, обратите внимание, что присутствуют клавиши NO url
... использование stateParams и URL-адресов НЕ смешиваются. Они взаимно исключают друг друга.
В вызове $state.go() определите его как таковой:
$state.go('view', { 'index': 123, 'anotherKey': 'This is a test' })
Переменные index
и anotherKey
$stateParams будут ТОЛЬКО заполняться, если они сначала перечислены в определяющем ключ $stateController params
.
Внутри контроллера включите $stateParams, как показано:
app.controller('overviewController', function($scope, $stateParams) {
var index = $stateParams.index;
var anotherKey = $stateParams.anotherKey;
});
Переданные переменные должны быть доступны!
В моем случае я попробовал все варианты, приведенные здесь, но никто не работал должным образом (angular 1.3.13, ionic 1.0.0, angular -ui-router 0.2.13). Решение было:
.state('tab.friends', {
url: '/friends/:param1/:param2',
views: {
'tab-friends': {
templateUrl: 'templates/tab-friends.html',
controller: 'FriendsCtrl'
}
}
})
и в state.go:
$state.go('tab.friends', {param1 : val1, param2 : val2});
Приветствия
reload: true
?Не мог понять, что происходит в течение самого долгого времени - оказывается, я обманывал себя. Если вы уверены, что все написано правильно, и вы будете использовать одно и то же состояние, попробуйте reload: true
:
.state('status.item', {
url: '/:id',
views: {...}
}
$state.go('status.item', { id: $scope.id }, { reload: true });
Надеюсь, это экономит ваше время!
У меня возникла аналогичная проблема. Я закончил с рабочим решением после большого количества поисковых запросов и пробных испытаний. Вот мое решение, которое будет работать для вас.
У меня есть два контроллера - searchBoxController и stateResultController и параметр с именем searchQuery, который будет передан из представления, имеющего окно поиска к представлению показывая результаты, полученные с удаленного сервера. Вот как вы это делаете:
Ниже приведен контроллер, из которого вы вызываете следующее представление, используя $state.go()
.controller('searchBoxController', function ($scope, $state) {
$scope.doSearch = function(){
var searchInputRaw = $scope.searchQueryInput;
$state.go('app.searchResults', { searchQuery: searchInput });
}
})
Ниже приведено состояние, которое будет вызываться при выполнении $state.go()
:
.state('app.searchResults',
{
url: '/searchResults',
views:
{
'menuContent': { templateUrl: 'templates/searchResult.html', controller: 'stateResultController' }
},
params:
{
'searchQuery': ''
}
})
И, наконец, контроллер, связанный с состоянием app.searchResults
:
.controller('stateResultController', function ($scope, $state, $stateParams, $http) {
$scope.searchQueryInput = $stateParams.searchQuery;
});
И в моем случае родительского/дочернего состояния. все параметры, объявленные в дочернем состоянии, должны быть известны родительским состоянием
.state('full', {
url: '/full',
templateUrl: 'js/content/templates/FullReadView.html',
params: { opmlFeed:null, source:null },
controller: 'FullReadCtrl'
})
.state('full.readFeed', {
url: '/readFeed',
views: {
'full': {
templateUrl: 'js/content/templates/ReadFeedView.html',
params: { opmlFeed:null, source:null },
controller: 'ReadFeedCtrl'
}
}
})
Решение, которое мы получили, чтобы иметь состояние, которое принимало 2 параметра, менялось:
.state('somestate', {
url: '/somestate',
views: {...}
}
к
.state('somestate', {
url: '/somestate?id=:&sub=:',
views: {...}
}
Если это параметр запроса, который вы хотите передать следующим образом:
/toState?referer=current_user
тогда вам нужно описать свое состояние следующим образом:
$stateProvider.state('toState', {
url:'toState?referer',
views:{'...'}
});
источник: https://github.com/angular-ui/ui-router/wiki/URL-Routing#query-parameters