Не удается заставить $ anchorScroll работать над $ stateChangeSuccess?

Я пытаюсь адаптировать ответ в этом аналогичном вопросе. Как обрабатывать привязку привязки привязки в AngularJS. Мне нужно иметь возможность использовать его с ui-router. Я протестировал прокрутку якоря как функцию clickable в моем контроллере, и это работает. Вот код для этого

$scope.anchor = function () {
 console.log('test');
 $location.hash('comments');
 $anchorScroll();
};

Если я попытаюсь вызвать эту функцию, сразу ничего не произойдет

$scope.anchor();

Если я попытаюсь вызвать его на $ stateChangeSuccess, ничего не произойдет. Я бросил журнал для здравомыслия, и это стреляет. Я также попробовал трюк, чтобы предотвратить дальнейшую логику маршрутизации. Он упоминался в связанном сообщении, но я не уверен, что это необходимо для моего дела.

app.run(function ($rootScope, $location, $stateParams, $anchorScroll) {

 // allow anchorScrolling
 $rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams) {
 console.log('stateChangeSuccess');
 var old = $location.hash();
 $location.hash('comments');
 $anchorScroll();

 //reset to old to keep any additional routing logic from kicking in
 $location.hash(old);
 });

});

Я предполагаю, что я бегу в условия гонки, или мой якорный свиток каким-то образом вызывает другое изменение маршрута. Но я не могу понять, как отследить эти проблемы. Есть предположения?

EDIT: Update Я удалил $ location.hash (старый); и положить остальные $ anchorScroll в функцию тайм-аута, и теперь она работает. Я также добавил в $ stateParams.scrollTo, чтобы сделать это пригодным для использования с параметрами запроса. Любые идеи относительно того, что вызывает мое состояние гонки и как это можно решить без функции $ timeout?

$rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams) {
 console.log('stateChangeSuccess');

 $timeout(function() {
 $location.hash($stateParams.scrollTo);
 $anchorScroll();
 }, 300);


});
1 ответ

Из документации $ anchorScroll

It also watches the $location.hash() and scrolls whenever it changes to match any anchor. This can be disabled by calling $anchorScrollProvider.disableAutoScrolling().

Попробуйте удалить $ location.hash (старый);

Если это исправлено, используйте $ anchorScrollProvider.disableAutoScrolling(), чтобы отключить реакцию на другое изменение состояния.

licensed under cc by-sa 3.0 with attribution.