Autoscroll to TOP с ui-router и Angularjs
Я читал так много разных проблем с этим, и ни одно из приведенных решений, похоже, не соответствует моему варианту использования. Я начал с простого размещения target = "_ top" во всех моих ссылках, но это фактически заставляет мое приложение перезагружать, что не работает. Я также видел, что люди говорят, что используют autoscroll = "true" , но это работает только в том случае, если оно находится в моем ui-view.
Проблема в том, что в моем файле index.html у меня есть фиксированный nav и другие статические элементы, которые выше моего первого ui-view. Это означает, что когда я перехожу на другие страницы, я теряю навигацию, поскольку страница загружается мимо этих элементов. Я также попытался положить это на тело с помощью:
<body autoscroll="true">
</body>
Это тоже ничего не делает. Итак, вопрос в том, как я могу убедиться, что новые страницы (новые изменения маршрута с ui-router) приводят к началу в верхней части страницы? СПАСИБО!
Ответы
Ответ 1
Если вы хотите, чтобы он всегда прокручивался до 0 кросс-браузера, ничего не делайте с помощью autoscroll. Просто разместите этот блок выполнения:
$rootScope.$on('$stateChangeSuccess', function() {
document.body.scrollTop = document.documentElement.scrollTop = 0;
});
Ответ 2
У меня была точно такая же проблема: фиксированный navbar при изменении маршрута, загрузка страницы частично прокручивалась по странице.
Я просто добавил autoscroll="false"
в ui-view
, например:
<div ui-view="main" autoscroll="false"></div>
изменить
Просто протестировал этот метод, бит грязного взлома, но он работает. Импортируйте службы angular $anchorScroll
и $location
в соответствующие контроллеры для конфигурации ui-router .state
. Затем используйте $watch
на ui-router $stateParams
для вызова $location.hash('top');
при изменении маршрута/состояния.
https://docs.angularjs.org/api/ng/service/ $anchorScroll
https://docs.angularjs.org/api/ng/service/ $location # hash
.controller('myCtrl', function ($location, $anchorScroll, $scope, $stateParams) {
$scope.$watchCollection('$stateParams', function() {
$location.hash('top');
$anchorScroll();
});
});
Ответ 3
Я использую ui-router. Мой прогон выглядел так:
.run(function($rootScope, $state, $stateParams){
$rootScope.$state = $state;
$rootScope.$stateParams = $stateParams;
$rootScope.$on('$stateChangeSuccess', function() {
document.body.scrollTop = document.documentElement.scrollTop = 0;
});
})
Ответ 4
Для этого существует служба Angular.
https://docs.angularjs.org/api/ng/service/$anchorScroll
Пример кода:
.run(function ($rootScope, $state, $stateParams, $anchorScroll) {
$rootScope.$on('$stateChangeStart', function () {
$anchorScroll();
});
});
Если вы хотите перейти к определенному элементу
.run(function ($rootScope, $state, $stateParams, $anchorScroll) {
$rootScope.$on('$stateChangeStart', function () {
// set the location.hash to the id of
// the element you wish to scroll to.
$location.hash('bottom');
// call $anchorScroll()
$anchorScroll();
});
});
Ответ 5
Мне пришлось сделать комбинацию двух других ответов.
<div ui-view autoscroll="false"></div>
В сочетании с
$rootScope.$on('$stateChangeSuccess', function() {
document.body.scrollTop = 0;
document.documentElement.scrollTop = 0;
});
Примечание.. Это v0.2.15 из ui-router
Ответ 6
То же самое, что и исключенный ответ от @TaylorMac, но в $locationChangeStart.
index.run.js:
$rootScope.$on('$locationChangeStart', function() {
document.body.scrollTop = document.documentElement.scrollTop = 0;
});
Ответ 7
Используя версию 1.0.6, событие $stateChangeSuccess
устарело в пользу службы $transitions
. Вот код, который я использовал для прокрутки вверху при каждом изменении состояния:
app.run(['$transitions', function ($transitions) {
$transitions.onSuccess({}, function () {
document.body.scrollTop = document.documentElement.scrollTop = 0;
})
}]);