TL; DR:使用Angular UI路由器,是否可以自动滚动到显示它的模板所属的相同状态的视图?
设置
我有一个Angular 1.4.1
应用,使用UI路由器0.2.15
和Angular Material 0.10.0
。
有一个名为website
的父状态和三个子状态:home
,foo
和bar
。
父状态有一个wrapper
视图,该视图通过<ui-view>
中的index.html
标记显示。它还有另外两个视图header@website
和footer@website
,它通过wrapper
视图模板显示。
三个子状态中的每一个都有一个main
视图,该视图通过父状态的wrapper
视图模板显示。
我的期望
在父状态的wrapper
视图模板中,当我在autoscroll="true"
视图的ui-view
标记上设置header@website
时,我希望该页面会滚动到顶部每当国家改变。请参阅this SO question的接受答案。
发生了什么
单击页脚中的任何ui-sref
链接时,页面不会滚动到顶部。
我尝试过什么
如果我将autoscroll="true"
放在主视图的ui-view
标记上,它会按预期工作。但是,这不是我想要的,因为即使从地址栏导航到状态,标题也会从视图中隐藏。
我怀疑
我认为问题与header@website
属于website
状态的视图有关,而autoscroll
仅适用于通常显示在header
状态的视图当前模板。换句话说,index.html
视图通常会通过wrapper.html
而不是onView(withId(R.id.edtDeviceName)).perform(click());
显示。
问题
我的怀疑是否正确?我需要重构,还是有办法让这个工作原样?
提前致谢!
答案 0 :(得分:0)
虽然我不提倡在指令之外进行DOM操作,但快速而肮脏的解决方案是在顶级模块定义的.run
块中添加scrollTo方法,例如:
.run(function ($window, $rootScope) {
$rootScope.$on('$viewContentLoaded', function () {
var interval = setInterval(function () {
if (document.readyState == "complete") {
window.scrollTo(0, 0);
clearInterval(interval);
}
}, 1);
});
})
http://plnkr.co/edit/qPqy69o7F9aTjNbUTMGY?p=preview
(从这里借来https://stackoverflow.com/a/22166553/1516309)
我尝试使用ui-router的$anchorScroll()
方法,但由于您的链接位于页面底部,即页面滚动到的位置,因此您实际上并未注意到它正在执行任何操作。