我发现了一些不受欢迎的,至少对我来说,当路线改变时的行为。在教程http://angular.github.io/angular-phonecat/step-11/app/#/phones的第 11 步中, 您可以看到电话列表。如果您滚动到底部并单击最新的一个,您会看到滚动条不在顶部,而是在中间。
我也在我的一个应用程序中发现了这个,我想知道如何让它滚动到顶部。我可以手动完成,但我认为应该有其他优雅的方式来做到这一点,我不知道。
那么,有没有一种优雅的方式在路由改变时滚动到顶部呢?
我发现了一些不受欢迎的,至少对我来说,当路线改变时的行为。在教程http://angular.github.io/angular-phonecat/step-11/app/#/phones的第 11 步中, 您可以看到电话列表。如果您滚动到底部并单击最新的一个,您会看到滚动条不在顶部,而是在中间。
我也在我的一个应用程序中发现了这个,我想知道如何让它滚动到顶部。我可以手动完成,但我认为应该有其他优雅的方式来做到这一点,我不知道。
那么,有没有一种优雅的方式在路由改变时滚动到顶部呢?
问题是您的ngView在加载新视图时保留了滚动位置。您可以指示$anchorScroll
“在视图更新后滚动视口”(文档有点模糊,但在此处滚动意味着滚动到新视图的顶部)。
解决方案是添加autoscroll="true"
到您的 ngView 元素:
<div class="ng-view" autoscroll="true"></div>
只要把这段代码运行
$rootScope.$on("$routeChangeSuccess", function (event, currentRoute, previousRoute) {
window.scrollTo(0, 0);
});
这段代码对我很有用..我希望它也对你有用..你所要做的就是将 $anchorScroll 注入你的运行块并将监听器函数应用到 rootScope 就像我在下面的例子中所做的那样..
angular.module('myAngularApp')
.run(function($rootScope, Auth, $state, $anchorScroll){
$rootScope.$on("$locationChangeSuccess", function(){
$anchorScroll();
});
下面是 Angularjs module的调用顺序:
app.config()
app.run()
directive's compile functions (if they are found in the dom)
app.controller()
directive's link functions (again, if found)
RUN BLOCK 在注入器创建后执行并用于启动应用程序..这意味着当您重定向到新的路由视图时,运行块中的侦听器调用
$anchorScroll()
您现在可以看到滚动条从新的路由视图开始到顶部:)
在尝试了ui-view autoscroll=true
, $stateChangeStart
, $locationChangeStart
, $uiViewScrollProvider.useAnchorScroll()
,$provide('$uiViewScroll', ...)
和许多其他组合的一两个小时后,我无法按预期滚动到新页面的顶部。
这最终对我有用。它捕获 pushState 和 replaceState 并且仅在导航到新页面时更新滚动位置(后退/前进按钮保留其滚动位置):
.run(function($anchorScroll, $window) {
// hack to scroll to top when navigating to new URLS but not back/forward
var wrap = function(method) {
var orig = $window.window.history[method];
$window.window.history[method] = function() {
var retval = orig.apply(this, Array.prototype.slice.call(arguments));
$anchorScroll();
return retval;
};
};
wrap('pushState');
wrap('replaceState');
})
这是我的(看似)健壮、完整和(相当)简洁的解决方案。它使用与缩小兼容的样式(以及对module的 angular.module(NAME) 访问)。
angular.module('yourModuleName').run(["$rootScope", "$anchorScroll" , function ($rootScope, $anchorScroll) {
$rootScope.$on("$locationChangeSuccess", function() {
$anchorScroll();
});
}]);
PS我发现自动滚动的东西无论设置为true还是false都没有影响。