Yukarıdaki yanıtların tümü beklenen tarayıcı davranışını kırıyor. Çoğu insanın istediği şey, "yeni" bir sayfa ise en üste kaydırılacak, ancak Geri (veya İleri) düğmesinden geçiyorsanız önceki konuma geri dönecek bir şeydir.
HTML5 modunu varsayarsanız, bu kolay olur (ancak bazı parlak insanlar bunu nasıl daha zarif hale getirebileceğinden emin olabilirim!):
// Called when browser back/forward used
window.onpopstate = function() {
$timeout.cancel(doc_scrolling);
};
// Called after ui-router changes state (but sadly before onpopstate)
$scope.$on('$stateChangeSuccess', function() {
doc_scrolling = $timeout( scroll_top, 50 );
// Moves entire browser window to top
scroll_top = function() {
document.body.scrollTop = document.documentElement.scrollTop = 0;
}
Çalışma şekli, yönlendiricinin en üste kaydırılacağını varsayar, ancak tarayıcıya bitirme şansı vermek için biraz geciktirir. Tarayıcı daha sonra değişikliğin Geri / İleri gezinme nedeniyle olduğunu bildirirse, zaman aşımını iptal eder ve kaydırma hiçbir zaman gerçekleşmez.
document
Kaydırma yapmak için ham komutları kullandım çünkü pencerenin en üstüne gitmek istiyorum. Sadece ui-view
kaydırmak istiyorsanız, yukarıdaki teknikleri kullanarak autoscroll="my_var"
nerede kontrol edeceğinizi ayarlayın my_var
. Ancak, sayfaya "yeni" olarak gidiyorsanız, çoğu insan tüm sayfayı kaydırmak isteyeceğini düşünüyorum.
Yukarıdaki kullanımların ui-yönlendirici, size rağmen yerine değiştirerek ng-rota kullanabilirsiniz $routeChangeSuccess
için $stateChangeSuccess
.