点击后退按钮后跳转到其他页面时,滚动位置不会重置。

19

我的AngularJS应用程序中滚动出现了问题。

这个应用程序有两个页面:第一个页面是客户列表,您可以选择其中之一并查看其详细信息。第二个页面是公司列表,它的工作方式相同。

我使用面板通过 $location.path() 在它们之间导航。还有一个返回按钮,使用 $window.history.back() 实现。

当您在客户或公司列表中选择其中一个项目,并在此之后按下返回按钮时,您将返回到先前的页面(客户或公司列表),并恢复滚动位置。我使用标准的 $window.history.back() 功能,没有实现任何自定义内容。

但是,问题出现在这里:如果您不滚动任何方向,只需转到另一页(到其他项目列表),滚动位置不会重置。但是,如果您甚至只滚动了一点点,它的位置就会重置。而且,如果您不使用返回按钮,一切都正常。

那么,问题是: 在使用$window.history.back()后,如何在转到另一页时重置滚动位置?

我还使用了infinite-scroll插件,如果有影响的话。但即使我关闭了它,也没有改变,所以我想问题不在插件上。


你尝试过使用 <body autoscroll="true"> 吗? - Basar Sen
我有,但是它并没有太大帮助... - renchan
当导航到新页面时,您希望滚动位置位于页面顶部吗? - Guillaume
是的,它的工作原理是这样的,除非我在到达新页面之前按下返回按钮(在返回后没有滚动),在这种情况下,滚动位置将不会在顶部,无论我尝试多少次转到另一页,只有当我在下一个转换之后滚动它(甚至只是向下/向上移动一个像素)它才会返回到顶部。 - renchan
1
你能否在 jsfiddle 上发布一个关于你问题的示例?你是否尝试过在控制器初始化时执行 @anmarti 建议的操作? - jjbskir
显示剩余4条评论
3个回答

2

我之前遇到过类似的问题,并想出了一个简单(但不太优雅)的解决方案。

当视图改变时,我将包装器滚动条位置的值存储在作用域中。回退时,我再次将该值应用于包装器。

实际上,我不记得点击后退浏览器按钮时它的行为如何。您需要检查一下。


更改视图并存储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


0

你可以通过在控制器初始化时触发函数来捕获重新加载事件,前提是这些控制器被包装在立即调用的函数表达式中。就像这样:

(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事件着陆在此页面上。


-1

我已将以下代码添加到 AngularJS 教程中著名的 Phonecat 应用程序中,它可以正常运行:

    phonecatApp.run(function($rootScope, $window) {
        $rootScope.$on('$viewContentLoaded', function(){
            $(document).ready(function(){ window.scrollTo(0, 0); });
        });
    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接