2015-02-11 67 views
6

我正在使用Angular UI路由器,这在大多数情况下运行良好。但是,我有一种情况,我不知道提前查询字符串参数的名称。Angular UI路由器 - 允许任何查询字符串参数

所以通常与UI路由器,你会定义一个路线是这样的:

$stateProvider.state('test', { 
 
\t url: '/test?testQueryStringParam', 
 
\t templateUrl: 'Test.html', 
 
\t controller: 'TestController' 
 
});

然后在我的控制器使用我$ stateParams可以访问testQueryStringParam。

但是,在UI路由器中,您无法访问路由定义中未指定的任何查询字符串参数。

Angular框架附带的路由器允许您执行此操作。所以我试图用我的UI路由器定义使用$ location服务。这确实是一些工作。

当我想添加一个查询字符串参数使用:

$location.search("paramName", "paramValue");

当我想我只是使用查询字符串值:

$location.search()

这会更新URL,但不会重新实例化控制器(如$ state.go($ state.current,{},{reload:true})would)。这似乎不是一个大问题,因为我可以自己重新加载数据。但是,如果您在浏览器中使用后退按钮,它将再次更改URL,但不会重新实例化控制器。

反正是有

  1. 我能得到这个只用UI路由器工作?

  2. 获得使用$ location实际重新实例化控制器的解决方法。

作为最后的手段,我也尝试指导更新window.location,但这刷新整个页面是不可接受的。

感谢

回答

0

您可以传递一个没有出现在URL

$stateProvider.state('test', { 
    url: '/test?testQueryStringParam', 
    params: { 
    optParam: null, 
    }, 
    templateUrl: 'Test.html', 
    controller: 'TestController' 
}); 

正如你可以看到非URL参数,optParam是用的空默认值的可选参数,并且不会在可见网址

你可以在你的控制器使用访问此PARAM $stateParams

$stateParams.optParam 

这是有帮助的blog

相关问题