使用angularjs和ui-router,如何禁用一个视图更改的导航器历史记录

时间:2014-06-15 17:13:28

标签: angularjs angular-ui-router

我希望当前状态更改不会保存在导航历史记录中。然后,当用户点击'后退时,将跳过该视图并返回上一页。

我可以暂时禁用状态更改以保存在导航历史记录中吗?

3 个答案:

答案 0 :(得分:6)

我相信这是ui-router的值为{ location:'replace'}的选项参数的用途。

文档说明:

  

location布尔值或"替换" (默认为true),如果为true则会更新   url在位置栏中,如果为false则不会。如果字符串"替换",将   更新网址并替换上次历史记录。

似乎有一个问题(见here on GitHub)要修复。

答案 1 :(得分:2)

本着stackoverflow的精神,我会尝试回答这个问题而不是提到你要求的是一个真正可怕的黑客; - )

我想你可能需要这样的东西。 (代码是coffeescript)

angular
.module 'app', ['ui.router']
.run ($rootScope, $state) ->
    $rootScope.$on '$locationChangeStart', (event) =>
        if $state.is 'bad-state'
            event.preventDefault()
            $state.go 'good-state'

当位置发生变化时(您也可以使用$stateChangeStart),您可以检查当前状态,如果它是您不想要的状态,那么您将进入您想要的状态。 event.preventDefault()有效地停止了对最初请求状态的处理。

如果您需要更脏的版本,那么您可以检查位置网址而不是状态,并使用$location.url执行转移,如下所示:

angular
.module 'app', ['ui.router']
.run ($rootScope, $location) ->
    $rootScope.$on '$locationChangeStart', (event, nextLocation) =>
        if nextLocation is '/bad/location'
            event.preventDefault()
            $location.path '/good/location'

答案 2 :(得分:0)

这对我有用。

$rootScope.$on('$stateChangeStart', 
function(event, toState, toParams, fromState, fromParams){
   event.preventDefault();
   window.history.forward();
});