2014-12-20 48 views
1

我重新加載了路線,使用$route.reload(),我需要在重新加載頁面之前保留相同的滾動位置。如果路線重新加載,如何保留滾動位置?

但是,重新加載路線後,滾動位置指向頂部。

例如,如果我用我的重裝應用程序,

$window.location.path();

它保留了相同的滾動位置。但我不想重新加載應用程序。我只想重新加載路線,並且需要保持相同的滾動位置。

請給你寶貴的命令。

在此先感謝。

+0

可以使用'$ scope.on('$''')在服務中存儲當前的'scrollTop',並在控制器再次加載時查看是否設置了該服務變量。一個簡單的指令可能是最好的 – charlietfl

回答

0

我這裏有AngularJsScrollPersisterDemo

示例代碼發佈的代碼工作對我來說,當我在一個網站主機上的文件。魔術確實在指令和服務中完成。

指令:

(function (angular) { 
    "use strict"; 

    angular.module("ScrollPersisterApp").directive("scrollPersister", ["scrollPersisterService", scrollPersister]); 

    function scrollPersister(scrollPersisterService) { 
     return { 
      restrict: "A", 
      link: function (scope, element, attributes) { 
       element[0].scrollTop = scrollPersisterService.GetScrollTop(); 

       scope.$on('$destroy', function() { 
        scrollPersisterService.SetScrollTop(element[0].scrollTop); 
       }); 
      } 
     }; 
    } 
})(angular); 

的指令設置經由注入scrollPersisterService的div scrollTop的,當它被破壞,例如通過$ route.reload()。重載時,該指令從scrollPersisterService讀取scrollTop值,並通過JavaScript將其設置爲div的scrollTop。

查看我的github存儲庫我鏈接了完整的示例。我已經在最新版本的Chrome中測試過這些代碼,並且效果很好。

0

您可以設置一個自定義狀態參數,告訴您的控制器將頁面滾動到哪裏。

angular.module("app").controller('MyController', function($scope, $state, $stateParams, $timeout) { 
    if($stateParams.scrollY) { 
    $timeout(function() { 
     window.scrollTo(0, $stateParams.scrollY); 
    }); 
    } 
    $scope.reloadRoute = function(){ 
    params = angular.copy($stateParams); 
    params.scrollY = window.scrollY; 
    $state.transitionTo($state.current, params, { 
     reload: true, 
     inherit: false, 
     notify: true 
    }); 
    } 
}); 

this answer的啓發。

相關問題