【问题标题】:Scroll to top of div in AngularJS?滚动到AngularJS中的div顶部?
【发布时间】:2014-07-25 07:30:31
【问题描述】:

我正在将 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>

【问题讨论】:

    标签: javascript jquery html css angularjs


    【解决方案1】:

    我也遇到过同样的问题,我通常使用以下通用指令来解决它。它监听一个给定的事件,每当该事件发生时,它会将元素滚动回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">
    

    【讨论】:

    • 感谢您的回答。这是一个更完整的解决方案,但我想补充一点,在我的原始帖子中存在一种导致问题的类型。正确的 jQuery 命令应该是$('#myList').scrollTop(0); 注意0
    • 很好,您应该将其作为编辑添加到您的问题中,以便更明显:)
    • 非常干净的解决方案,谢谢!当我使用您的指令时,Angular 1.2.28 出现以下错误:“指令未定义”。我设法通过返回一个包含链接函数的对象来解决它:angular.module("ui.scrollToTopWhen", []).directive("scrollToTopWhen", ['$timeout', function ($timeout) { return { link: function (scope, element, attrs) { ... } } }]);
    【解决方案2】:

    我只需添加一个监视 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/

    【讨论】:

      【解决方案3】:

      我在表格正文滚动方面遇到了同样的问题。 我已经通过以下方式解决了。

      这是我的示例 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

      谢谢。

      【讨论】:

      • 这是一个 jQuery 答案而不是 Angular 答案。
      【解决方案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();
      })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-27
        • 2015-05-06
        • 1970-01-01
        相关资源
        最近更新 更多