AngularJS $ location replace()也替换了上一个历史条目

时间:2015-01-13 11:20:36

标签: angularjs html5-history

在我的AngularJS应用程序中,我只需保存浏览器历史记录中的状态更改。这就是为什么当我更改$ location的参数时,我使用了replace()方法。

例如,当我访问/ page1时,它将保存在历史记录中。 '中心'参数是使用replace()自动添加的,因此它不会添加新的历史记录条目:

$location.search('centre', hash).replace();

每次我移动地图时,中心都会出现问题。变化。

当我转到/ page2时,会创建历史记录中的新条目。当我移动地图时,' center'变化。

问题是,当我按下BACK按钮时,我会转到/ page1,但我需要保持'居中'与之前相同,但它会更改为与/ page1的历史记录条目一起保存的内容。

我该如何解决这个问题?

我试图添加:

$window.history.replaceState({}, '', $location.absUrl());

我替换()后,但没有工作。

3 个答案:

答案 0 :(得分:2)

我找到了调用搜索&在0ms超时内替换确保它在主状态更改的单独摘要周期中发生,并防止先前的状态被替换。

类似的东西:

$timeout(function() {
    $location.search('centre', hash).replace();
}, 0);

答案 1 :(得分:0)

这就是我解决这个问题的方法。

首先,我们需要将搜索结果保存为先前和当前:

$rootScope.$on('$locationChangeStart', function (event, toURL, fromURL) {
    if ($rootScope.search.current) {
        $rootScope.search.previous = $rootScope.search.current;
    }

    $rootScope.search.current = $location.search();
});

然后我们需要始终改变我们现在所处的实际位置。

$rootScope.$on('$locationChangeSuccess', function (event, toURL, fromURL) {
    $rootScope.actualLocation = $location.path();
});

如果按下前进按钮,则必须在URL中更改中心(使用以前的搜索结果)而不按下新的历史记录条目。

$rootScope.$watch(function () { return $location.path() }, function (newLocation, oldLocation) {
    if ($rootScope.actualLocation === newLocation) {
        $location.search('center', $rootScope.search.previous.center).replace();
    }
});

答案 2 :(得分:-2)

我遇到了同样的问题,只能通过使用原生历史API来实现它,如下所示:

window.history.replaceState(hash, null, $location.absUrl());