无法弄清楚为啥页面在底部加载? Angular UI-Router 自动滚动问题

Posted

技术标签:

【中文标题】无法弄清楚为啥页面在底部加载? Angular UI-Router 自动滚动问题【英文标题】:Can't figure out why page loads at bottom? Angular UI-Router autoscroll Issue无法弄清楚为什么页面在底部加载? Angular UI-Router 自动滚动问题 【发布时间】:2014-03-09 20:01:37 【问题描述】:

对于我的生活,我无法弄清楚为什么这个主页会加载到底部。这是 Angular ui-router、angular、javascript 还是 CSS 问题?我已经坚持了两个小时,不知道为什么我的 html 页面加载在底部而不是顶部,这真的扼杀了我作为程序员的自尊:/

这里是主页:[ URL Redacted ]

更新 -- 我解决了这个问题。它与 Angular UI-Router 一起使用。有关简单修复,请参阅下面的答案。

我使用 Angular 和 Angular UI-Router,设置看起来像这样......

default.jade

  doctype html
  html(lang='en', xmlns='http://www.w3.org/1999/xhtml', xmlns:fb='https://www.facebook.com/2008/fbml', itemscope='itemscope', itemtype='http://schema.org/Product')
  include ../includes/head
  body(ng-controller="RootController")
  block content
  include ../includes/foot

index.jade

extends layouts/default

block content
  section.container
    div(ui-view="header")
    div(ui-view="content")
    div(ui-view="footer")

Angular Config.js

window.app.config(function($stateProvider, $urlRouterProvider) 
// For any unmatched url, redirect to "/"
$urlRouterProvider.otherwise("/");
// Now set up the states
$stateProvider
    .state('home', 
      url: "/",
      views: 
        "header":     templateUrl: "views/header/home.html"   ,
        "content":    templateUrl: "views/content/home.html"  ,
        "footer":     templateUrl: "views/footer/footer.html" 
      ,
      resolve:  factory: setRoot 
    )
    .state('signin', 
      url: "/signin",
      views: 
        "header":     templateUrl: "views/header/signin.html"   ,
        "content":    templateUrl: "views/content/signin.html"  ,
        "footer":     templateUrl: "views/footer/footer.html" 
      ,
      resolve:  factory: setRoot 
    )

【问题讨论】:

【参考方案1】:

Angular UI-Router 最近更新了它的应用程序,以便它自动向下滚动到默认加载的新视图。这导致我的应用程序页面向下滚动加载。要关闭此功能,只需将以下属性添加到您的 ui-view:

<div ui-view="header" autoscroll="true"></div>

【讨论】:

我遇到了 OP 描述的问题,这对我有用,我确实必须在我的几个 child.siblings[n] ui-view div 上添加此属性。 自发帖以来,ui-router 更改了自动滚动的默认操作。 autoscroll="false" 设置现在在加载新视图时保留滚动位置。但是autoscroll="true" 将加载新视图的顶部。 这个解决方案非常适合我。但是,当我使用浏览器后退按钮加载上一页时,由于 autoscroll='true' ,它也会滚动到顶部。解决方案是什么? 嗨,由于某种原因,这个自动滚动对我不起作用。我有一个加载嵌套 ui 视图的 ui 视图(3 个视图:页眉、内容和页脚)。当我进入重新加载内容视图并滚动到一半的状态时,然后重新加载我的浏览器,它会自动滚动回那个确切的位置。我已经尝试了所有使用 $uiViewScroll(element) 来制作 scrollTop 指令的方法。没有任何工作。现在有点让我发疯。我总是想从屏幕顶部开始,但我似乎无法绕过这个自动滚动功能。有人可以帮我解决吗? 难以置信。我只能对自己说:RTF。我没有在自动滚动中使用表达式。我使用autoscroll="false" 而不是autoscroll=" 'false' "。容易被忽视。也许在代码中可以捕捉到一些东西?如果是布尔值,则将其转换为表达式【参考方案2】:

这是一个可能的解决方案,我使用了一种解决方法,因为自动滚动对我不起作用,所以我强迫我的视图滚动到顶部。希望这会有所帮助。

app.run(['$window', '$rootScope', '$location' ,'$cookieStore', '$state', 'CacheManager',  '$timeout', function($window, $rootScope, $location, $cookieStore, $state,CacheManager, $timeout)


$rootScope.$on('$viewContentLoaded', function()

var interval = setInterval(function()
  if (document.readyState == "complete") 
      window.scrollTo(0, 0);
      clearInterval(interval);
  
,200);

);



]);

【讨论】:

这对我有用。我也能够简单地删除到下面的工作正常并删除了 200 毫秒的延迟...$rootScope.$on('$viewContentLoaded', function() window.scrollTo(0, 0); ); 一个更好的解决方案是使用 $anchorScroll() 而不是 window.scrollTo。我现在正在使用锚滚动并且它可以工作。 "$rootScope.$on("$viewContentLoaded", function() $anchorScroll(); );" "$rootScope.$on("$viewContentLoaded", function() $anchorScroll(); );"对我不起作用。但是这个工作: $rootScope.$on('$viewContentLoaded', function() window.scrollTo(0, 0); );简单高效 :) 感谢您的解决方案。【参考方案3】:

在运行块中添加:

$rootScope.$on('$stateChangeSuccess', function () 
  $anchorScroll();
 );

当然你必须注入 $anchorScroll 依赖

【讨论】:

使用 ui-router 它应该是“stateChangeSuccess”,因为“routeChangeSuccess”我猜是 ng-router 的?【参考方案4】:

在您的应用路由模块中,将以下内容添加到 RouterModule

RouterModule.forRoot(routes, scrollPositionRestoration: 'enabled')

【讨论】:

但是为什么会这样呢?有时没有此属性也可以工作【参考方案5】:

我不久前遇到了这个问题。发生的事情是您在第 1 页,向下滚动我想象的页面,然后单击一个按钮转到第 2 页。然后,当您转到下一页时,路由器不会重新调整您的滚动位置。我通过在所有路线更改上滚动到顶部来解决此问题。

【讨论】:

添加示例代码以显示您所做的工作将提高此答案的质量 我编辑了,因为它没有为答案添加任何内容。如果您没有时间写一个完整的答案,也许您应该直接发表评论? 我阅读并理解它纯粹是一种噪音,就像“嗨”、“谢谢”和“希望有帮助”一样 这是 Mindstormy 的一种解决方案。感谢您尝试提供帮助:) 在您的答案中添加代码可能会有所帮助,因为您实际上并没有提供任何解决方案。

以上是关于无法弄清楚为啥页面在底部加载? Angular UI-Router 自动滚动问题的主要内容,如果未能解决你的问题,请参考以下文章

Angular 10 - 如何在集合更改时自动加载新项目

试图弄清楚为啥我的表单的数据网格只保存前 35 行

无法弄清楚为啥我的注销按钮不起作用(php)[重复]

无法弄清楚为啥触发器无效?

无法弄清楚为啥我的提交按钮不会提交

无法弄清楚为啥“悬停”不起作用