2015-01-13 1 views
4

В моем приложении AngularJS мне нужно сохранить только изменения состояния в истории браузера. Поэтому, когда я изменяю параметры $ location, я использую метод replace().

Например, когда я обращаюсь к странице/page1, она сохраняется в истории. Параметр «центр» добавляется автоматически с заменой(), поэтому он не добавляет новую запись истории:

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

Каждый раз, когда я двигаюсь карту, изменения «Центр».

Когда я перехожу в/page2, создается новая запись в истории. Когда я перемещаю карту, меняется «центр».

Дело в том, что когда я нажимаю кнопку BACK, я собираюсь/page1, но мне нужно сохранить «центр» так же, как и раньше, но он изменяется на то, что было сохранено вместе с записью истории/page1 ,

Как я могу исправить эту проблему?

Я пытался добавить:

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

После я заменить(), но не работает.

ответ

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

Я нашел вызов поиска & заменить Внутри 0ms таймаут гарантирует, что происходит в отдельном переваривать цикл от основного изменения состояния и предотвращает предыдущее состояние заменяется.

Что-то вроде:

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

Нет необходимости для переваривания вызова, если не называется снаружи угловой дайджест, метод замены устанавливает флаг для замены истории внутри угловой в течение текущего цикла дайджеста и будет обновляться до значения false после завершения дайджеста. –

-2

У меня была такая же проблема, и может только получить его работу, используя родной API истории, например, так:

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

Цикл дайджест загрузит страницу –

Смежные вопросы