我试图通过使用UI路由器的按钮单击来更改我的AngularJS应用程序的状态。当我按下按钮时,所需的信息正在正确发送,但是,当状态改变时,URL参数正在消失。例如,如果我的路由被定义为/ parent / state / child /:param并且我转到/ parent / state / child / 3,当转换完成时,“3”消失,我留在/ parent /状态/儿童/.
我尝试过使用
转换$state.go('parentState.childState', {param: 3});
以及
$location.path('/parent/state/child/3);
甚至
$window.location.href = '/parent/state/child/3;
所有人都有相同的结果。
这是我的州档案:
(function() {
'use strict'
angular.module('app')
.config(states);
states.$inject = ['$stateProvider', '$locationProvider'];
function states($stateProvider, $locationProvider) {
$locationProvider.html5Mode(true);
$stateProvider.state({
name: 'parentState',
url: '/parent/state',
abstract: true,
template: '<ui-view/>'
})
.state({
name: 'parentState.childState',
url: '/child/:param',
templateUrl: 'some/route',
controller: function ($stateParams) {
console.log($stateParams);
}
});
}
})();
正在正确加载子状态的模板URL。我也能看到我$state.go('parentState.childState, {param: value});
中设置的值是正确的,但是,当我将$stateParams
输出到控制台时,我得到{param: ""}
。即使我尝试直接转到某个链接(即在我的浏览器中键入/ parent / state / child / 5),最终参数也会消失。
关于我可能做错什么的任何想法? 感谢
答案 0 :(得分:0)
一种解决方案是在状态中明确设置参数:
.state({
name: 'parentState.childState',
url: '/child',
params: {
mySpecialParam: null
},
templateUrl: 'some/route',
controller: function ($stateParams) {
console.log($stateParams);
}
})
$ stateParams现在应该显示{mySpecialParam:null}
当你从一个州搬到另一个州时:
$state.go('parentState.childState', { mySpecialParam: 3 })
或者
<a ui-sref="parentState.childState({ mySpecialParam: 3 })">View childState</a>
另外,我建议让你的参数名称不要像#param / params&#39;,以及价值的语义,所以它很明显。
有关stateProvider特定部分的更多信息,请参阅ui-router的URL Routing页面。
答案 1 :(得分:0)
我发现了问题。
由于我的应用程序设置方式,我无法将resolve
与UI路由器一起使用。相反,我有一个功能设置来防止默认状态更改,运行需要解决的事情,如果它们成功完成,继续原始转换。在该部分中,当我应该使用$state.go(toState.name);
时,我正在使用$state.go(toState.name, toParams);
。由于参数未被传递,因此它们在URL中丢失。