更改状态时,AngularJS UI路由器URL参数将消失

时间:2017-11-03 19:52:17

标签: angularjs nested angular-ui-router

我试图通过使用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),最终参数也会消失。

关于我可能做错什么的任何想法? 感谢

2 个答案:

答案 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中丢失。