Автопрокрутка в ТОП с помощью ui-router и Angularjs
Я прочитал так много разных проблем с этим, и ни одно из приведенных решений не подходит для моего варианта использования. Я начал с того, что просто поместил target="_top" на все мои ссылки, но на самом деле это заставило мое приложение перезагрузиться, что не сработало. Я также видел, как люди говорят, что они используют autoscroll="true", но, похоже, это работает, только если это в моем пользовательском интерфейсе.
Проблема заключается в том, что в моем файле index.html я исправил nav и другие статические элементы, которые находятся выше моего первого пользовательского интерфейса. Это означает, что когда я перехожу на другие страницы, я теряю навигацию, поскольку страница загружается мимо этих элементов. Я также попытался нанести это на тело с помощью:
<body autoscroll="true">
</body>
Кажется, это тоже ничего не делает. Итак, вопрос в том, как я могу убедиться, что новые страницы (новые изменения маршрута от ui-router) приводят к началу страницы вверху? СПАСИБО!
7 ответов
Если вы хотите, чтобы кросс-браузер всегда прокручивался до 0, ничего не делать с автопрокруткой. Просто поместите этот блок бега:
$rootScope.$on('$stateChangeSuccess', function() {
document.body.scrollTop = document.documentElement.scrollTop = 0;
});
Используя версию 1.0.6, $stateChangeSuccess
событие не рекомендуется в пользу $transitions
оказание услуг. Вот код, который я использовал для прокрутки вверх при каждом изменении состояния:
app.run(['$transitions', function ($transitions) {
$transitions.onSuccess({}, function () {
document.body.scrollTop = document.documentElement.scrollTop = 0;
})
}]);
У меня была точно такая же проблема, исправил navbar при смене маршрута, загрузка страницы частично прокручивалась вниз по странице.
Я только добавил autoscroll="false"
в ui-view
, вот так:
<div ui-view="main" autoscroll="false"></div>
редактировать
Только что проверил этот метод, немного грязного взлома, но он работает. Импорт угловых услуг $anchorScroll
& $location
в соответствующие контроллеры для UI-роутера .state
конфигурации. Тогда используйте $watch
на UI-роутере $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();
});
});
Для этого есть сервис 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();
});
});
Я использую UI-роутер. Мой пробег выглядел так:
.run(function($rootScope, $state, $stateParams){
$rootScope.$state = $state;
$rootScope.$stateParams = $stateParams;
$rootScope.$on('$stateChangeSuccess', function() {
document.body.scrollTop = document.documentElement.scrollTop = 0;
});
})
Я должен был сделать комбинацию двух других ответов.
<div ui-view autoscroll="false"></div>
В комбинации с
$rootScope.$on('$stateChangeSuccess', function() {
document.body.scrollTop = 0;
document.documentElement.scrollTop = 0;
});
Примечание: это на v0.2.15 ui-router
Сделал то же самое, что и исключенный ответ от @TaylorMac, но в $ locationChangeStart.
index.run.js:
$rootScope.$on('$locationChangeStart', function() {
document.body.scrollTop = document.documentElement.scrollTop = 0;
});