滚动到AngularJS中的div顶部?

时间:2014-06-04 15:02:30

标签: javascript jquery html css angularjs

我正在将AngularJS用于小型Web应用程序并遇到问题。我正在使用ng-repeat填充div内的列表。 div具有固定的高度并设置为overflow-y: auto,这意味着当列表对于div太大时会出现滚动条。我的问题是,当重新绘制列表时,即数据支持ng-repeat更改时,滚动条不会重置到div的顶部。相反,它在ng-repeat更改之前保持在滚动条所处的任何位置。这是一种非常糟糕的用户体验。我没试过就试过以下事情:

<div id="myList">
  <ul>
    <li ng-repeat="item in items">{{item}}</li>
  </ul>
</div>

<a ng-click="switchItems()">Switch</a>

<script>
function MyApp($scope) {
  $scope.switchItems = function() {
    $('#myList').scrollTop();
    $scope.items = [1, 2, 3, 4]; // new items
  };
}
</script>

4 个答案:

答案 0 :(得分:54)

我遇到了同样的问题,我通常使用以下通用指令解决它。它侦听给定的事件,每当该事件发生时,它将元素滚动回y = 0。当您的列表发生变化时,您需要做的只是$broadcast控制器中的事件。

angular.module("ui.scrollToTopWhen", [])
.directive("scrollToTopWhen", function ($timeout) {
  function link (scope, element, attrs) {
    scope.$on(attrs.scrollToTopWhen, function () {
      $timeout(function () {
        angular.element(element)[0].scrollTop = 0;
      });
    });
  }
});

用法:

// Controller
$scope.items = [...];
$scope.$broadcast("items_changed")

// Template
<div id="myList" scroll-to-top-when="items_changed">

答案 1 :(得分:19)

我只需添加监视 DIV内容的指令。只要内容发生变化,它就会滚动到顶部!此解决方案不需要事件处理(我认为这是不必要的)。

mod.directive('scrollToTop', function(){
    return {
        restrict: 'A',
        link: function postLink(scope, elem, attrs) {
            scope.$watch(attrs.scrollToTop, function() {
                elem[0].scrollTop = 0;
            });
        }
    };
});

然后,html标记将使用该指令触发滚动:

<div class='myList' data-scroll-to-top='data.items.length'>
  <ul>
    <li data-ng-repeat='item in data.items'>{{item}}</li>
  </ul>
</div>

当您向列表中添加项目时,DIV将滚动到顶部! 这是一个带有工作代码的jsFiddle: http://jsfiddle.net/pkgbtw59/89/

答案 2 :(得分:4)

我遇到了与表体滚动相同的问题。 我已经按照以下方式解决了这个问题。

这是我的示例html。

<table id="rateplanmapping-scroll">
    <thead>
       <th></th>....
    </thead>
    <tbody >
        <tr ng-repeat="data in datas"> //this is the data
            <td></td>.....
        </tr>
    </tbody>
</table>

这是滚动到顶部的角度代码

<script>

  angular.element("#rateplanmapping-scroll tbody")[0].scrollTop=0; 

</script>

我希望它有所帮助 您可以将此脚本放在所需的函数中, 因此,当特定事情发生时,它会自动触发。要么 也可以附加到活动中。

对于div元素,可以按照以下方式完成

http://plnkr.co/edit/0B4zrFTho6GYuPAS0S1A?p=preview

感谢。

答案 3 :(得分:4)

您还可以根据docs

使用$ anchorScroll
// set the location.hash to the id of
// the element you wish to scroll to.
$location.hash('bottom');

// call $anchorScroll()
$anchorScroll();

你需要在$ timeout内包装它:

$timeout(function() {
  $location.hash('myList');
  $anchorScroll();
})