使用Angular ui-router设置URL查询参数,无需更改状态

我应该如何使用AngularJS的ui-router更新查询参数来更新地址栏URL,以便在刷新页面时保持状态?

目前,我使用$state.transitionTo('search', {q: 'updated search term'})每当input更改,但问题是,这重新加载控制器,重绘窗口,失去了任何文字input焦点。

有没有办法更新stateParams并将其同步到窗口的URL?

我有困难.transitionTo直到我更新到路由器 0.2.14。 0.2.14正确地改变地址栏(不重新加载控制器)使用这样的调用:

 $state.transitionTo('search', {q: 'updated search term'}, { notify: false }); 

编辑:今天玩了更多的一些,并认识到angularui路由器有本地routerProvider类似的选项:“reloadOnSearch”。

https://github.com/angular-ui/ui-router/wiki/Quick-Reference#options-1

它默认设置为true ,但是如果在状态中将其设置为false ,则查询参数更改时不会发生状态更改。 然后你可以调用$location.search(params);$location.search('param', value); URL将会改变,但是ui-router不会重build整个控制器/视图。 您可能还需要监听根作用域上的$locationChangeStart事件来处理应用程序中的历史logging动作,因为这些动作也不会导致状态更改。

我也听我的控制器的作用域上的$stateChangeSuccess事件来捕获页面/路由的初始负载。

有一些讨论github使用这个function的path变化(不只是URL的变化): https : //github.com/angular-ui/ui-router/issues/125但我还没有testing,因为我的用例特定于查询string参数。

我的答案的前一版本提到了这个github问题:

https://github.com/angular-ui/ui-router/issues/562

但是这是一个稍微分离的问题,具体performance为一种状态相对于另一种状态的模态,而没有非模式状态的变化。 我在这个问题上尝试了补丁,但很明显,这并不意味着阻止整个状态在URL更改上重新加载。

更新2015年5月19日

从ui-router 0.2.15开始,重新加载查询参数变化状态的问题已经解决。 但是,新的更新使用查询参数打破了历史API后退和前进function。 我一直没能find解决办法。

原版的

杰的回答对我来说并不奏效,也没有其他的答案。 尝试聆听$locationChangeStart在浏览器历史logging中来回导致问题,因为它会导致我运行两次代码:一次是新状态改变,另一次是因为$loationChangeStart被触发。

我试过使用reloadOnSearch=false ,但是即使URLpath改变时也阻止了状态的改变。 所以我终于通过下面的工作来实现它:

当您更改$location.search()以更新查询参数时,请使用“hack”临时禁用search重新加载,设置查询参数,然后重新启用重新加载。

 $state.current.reloadOnSearch = false; $location.search('query', [1,2]); $timeout(function () { $state.current.reloadOnSearch = undefined; }); 

这将确保查询参数更改不会重新加载状态,并且URLpath更改将正确地重新加载状态。

然而,当查询参数是url的一部分时,这并没有让浏览器历史logging改变状态(需要知道查询参数何时改变以重新读取URL)。 所以我也必须将每个查询参数的名称添加到状态的url属性。

 $locationProvider.html5Mode(true); $stateProvider .state('home', { url: '/?param1&param2&param3', templateUrl: 'home.html', controller: 'homeCtrl as home', }); 

以这种方式列出的URL上的任何参数名称都是可选的,但对这些参数名称的任何更改将在浏览器上按下后退和前进button时重新加载状态。

希望别人觉得这个很有用,而且不用花多天的时间来弄清楚怎么做(就像我做的那样)。