按后退按钮转到其他页面时滚动位置不会重置
Scroll position won't reset when go to other page after pressing back button
我在 angularjs 应用程序中滚动时遇到问题。
目前它有 2 个页面:第一页是客户列表,您可以 select 其中一个并查看其详细信息。第二个是公司列表,同理。
我正在使用一个面板通过 $location.path()
在它们之间导航。该应用程序还有一个后退按钮,使用 $window.history.back()
.
当您 select 客户或公司列表中的一项时,在它之后,当您按下返回按钮时,您将返回到上一页(客户或公司列表)并恢复滚动位置。我使用的是标准 $window.history.back()
功能,未实现任何自定义功能。
但这就是问题发生的地方:如果没有向任何方向滚动只是转到另一个页面(到其他项目列表)滚动位置不会' t 重置。但是如果你滚动它哪怕只是一点点,它的位置就会重置。另外,如果您不使用后退按钮,一切正常。
所以,问题是:使用$window.history.back()
后转到另一个页面时如何重置滚动位置?
我也在使用 infinite-scroll
插件,如果有的话。但即使我将其关闭,也没有任何变化,所以我想问题不在于插件。
我前段时间遇到了类似的问题,想出了一个简单的(但不是很好的解决方案)。
当视图更改时,我在范围内存储了包装器 scrolltop 值。回去时,我再次在包装器上应用了那个值。
实际上我不记得点击后退浏览器按钮时它的表现如何。你需要检查一下。
更改视图并存储 scrollTop 值
https://github.com/jedrzejchalubek/Reed/blob/master/src/app/controller/all.js#L20
angular.extend($scope.view, {
panel: false,
section: 'single',
single: el,
scrollPosition: $('#thumbs').scrollTop()
});
返回并重新应用 scrollTop 值
https://github.com/jedrzejchalubek/Reed/blob/master/src/app/directives/back-to-list.js#L14
scope.$apply(function() {
scope.view.section = 'list';
scope.view.panel = false;
});
$('#thumbs').scrollTop( scope.view.scrollPosition );
项目在github,所以你可以扫描它。也许这有帮助。 https://github.com/jedrzejchalubek/Reed
您可以通过在启动控制器时触发函数来捕获重新加载事件,前提是这些控制器包装在 Immediately Invoked Function Expression 中。像这样:
(function() {
angular.module("pstat")
.controller("homeCtrl", homeCtrl);
homeCtrl.$inject = ['$log', 'dataService', 'localStorageService', '$http'];
function homeCtrl ($log, dataService, localStorageService, $http) {
var vm = this;
$(document).getElementById("yourId").scrollTop(0);
});
})()
这将强制页面在控制器初始化时具有 0 垂直滚动偏移量,即在 $window.history.back 事件登陆此页面时的 I.E。
这是我从 AngularJS 教程中添加到著名的 phonecatApp 的东西,它有效:
phonecatApp.run(function($rootScope, $window) {
$rootScope.$on('$viewContentLoaded', function(){
$(document).ready(function(){ window.scrollTo(0, 0); });
});
});
我在 angularjs 应用程序中滚动时遇到问题。
目前它有 2 个页面:第一页是客户列表,您可以 select 其中一个并查看其详细信息。第二个是公司列表,同理。
我正在使用一个面板通过 $location.path()
在它们之间导航。该应用程序还有一个后退按钮,使用 $window.history.back()
.
当您 select 客户或公司列表中的一项时,在它之后,当您按下返回按钮时,您将返回到上一页(客户或公司列表)并恢复滚动位置。我使用的是标准 $window.history.back()
功能,未实现任何自定义功能。
但这就是问题发生的地方:如果没有向任何方向滚动只是转到另一个页面(到其他项目列表)滚动位置不会' t 重置。但是如果你滚动它哪怕只是一点点,它的位置就会重置。另外,如果您不使用后退按钮,一切正常。
所以,问题是:使用$window.history.back()
后转到另一个页面时如何重置滚动位置?
我也在使用 infinite-scroll
插件,如果有的话。但即使我将其关闭,也没有任何变化,所以我想问题不在于插件。
我前段时间遇到了类似的问题,想出了一个简单的(但不是很好的解决方案)。
当视图更改时,我在范围内存储了包装器 scrolltop 值。回去时,我再次在包装器上应用了那个值。
实际上我不记得点击后退浏览器按钮时它的表现如何。你需要检查一下。
更改视图并存储 scrollTop 值 https://github.com/jedrzejchalubek/Reed/blob/master/src/app/controller/all.js#L20
angular.extend($scope.view, {
panel: false,
section: 'single',
single: el,
scrollPosition: $('#thumbs').scrollTop()
});
返回并重新应用 scrollTop 值 https://github.com/jedrzejchalubek/Reed/blob/master/src/app/directives/back-to-list.js#L14
scope.$apply(function() {
scope.view.section = 'list';
scope.view.panel = false;
});
$('#thumbs').scrollTop( scope.view.scrollPosition );
项目在github,所以你可以扫描它。也许这有帮助。 https://github.com/jedrzejchalubek/Reed
您可以通过在启动控制器时触发函数来捕获重新加载事件,前提是这些控制器包装在 Immediately Invoked Function Expression 中。像这样:
(function() {
angular.module("pstat")
.controller("homeCtrl", homeCtrl);
homeCtrl.$inject = ['$log', 'dataService', 'localStorageService', '$http'];
function homeCtrl ($log, dataService, localStorageService, $http) {
var vm = this;
$(document).getElementById("yourId").scrollTop(0);
});
})()
这将强制页面在控制器初始化时具有 0 垂直滚动偏移量,即在 $window.history.back 事件登陆此页面时的 I.E。
这是我从 AngularJS 教程中添加到著名的 phonecatApp 的东西,它有效:
phonecatApp.run(function($rootScope, $window) {
$rootScope.$on('$viewContentLoaded', function(){
$(document).ready(function(){ window.scrollTo(0, 0); });
});
});