如何强制URL params出现在ui-router的URL中?

时间:2015-07-07 17:47:44

标签: javascript angularjs router angular-ui-router

我有一个简单的users.list状态,配置如下:

$stateProvider.state('users.list', {
  url: '/users/list?type',
  reloadOnSearch: false,
  templateUrl: 'templates/users/list.html',
  params: {
    type: { value: 'all' },
  },
});

我试图强制类型参数始终显示在网址中。当我点击ui-sref指令生成的链接时,效果很好。当我直接在浏览器中访问/users/list时会出现问题。尽管param已正确配置为$state.params,但它不会显示在URL中。

通常这不是一个大问题,但是当你需要使用季节性参数时它会成为一个问题。例如,想象一下,默认情况下,我只想列出从过去一周到现在注册的新用户。我可以设置一个参数from,其默认值为today - 7 days,每天都会有所不同。

因此,当用户与某人共享没有param的url时,会造成很多麻烦,例如:"嘿,从我的顶部删除第三个,它是作弊。 &#34 ;.如果收到邮件的人决定在另一天打开网址,则列表会有所不同,您可以看到我担心的内容。

我无法找到任何可以帮助我的东西,所以我在这里问。有谁做过吗?这可行吗?

2 个答案:

答案 0 :(得分:1)

a working plunker

我们只需要使用设置壁球:

.state('users.list', {
  url: '/users/list?type',
  reloadOnSearch: false,
  templateUrl: 'templates/users/list.html',
  params: {
    type: {
      value: 'all',
      squash: false,
    },
  },
});

检查here

有关详细信息,请参阅以下内容:

EXTEND(updated working plunker

如果我们希望初始页面也使用默认值,我们可以使用 .otherwise() 设置:

//$urlRouterProvider.otherwise('/users/list');
$urlRouterProvider.otherwise(function($injector, $location) {
    var state = $injector.get('$state');
    state.go('users.list');
    return $location.path();
});

检查that in action here并在此处阅读更多详细信息:

答案 1 :(得分:0)

我建议只在URL中创建一个没有state参数的状态,onEnter函数重定向到填充了所需参数的状态。