当前位置: 首页 > 面试题库 >

从AngularJS的顶部(反向)无限滚动

萧鹏云
2023-03-14
问题内容

我正在尝试进行反向无限滚动。我有,我收到了近10篇最近的评论,并希望用户能够滚动评论列表 最多 检索下一个10
-类似FB它显示了最近的评论的“获取前”链接,而是通过滚动事件,而不是链接。

我从http://jsfiddle.net/vojtajina/U7Bz9/开始,尝试将其修改为反向无限滚动,并很快以如下形式结束了:

  function Main($scope, $timeout) {
    $scope.items = [];

    var counter = 0;
    $scope.loadMore = function() {
      // simulate an ajax request
      $timeout( function() {
        for (var i = 0; i < 5; i++) {
          $scope.items.unshift({id: counter});
          counter += 10;
        }}, 1000);
    };

    $scope.loadMore();
  }

  angular.module('scroll', []).directive('whenScrolled', ['$timeout', function($timeout) {
    return function(scope, elm, attr) {
      var raw = elm[0];

      $timeout(function() {
        raw.scrollTop = raw.scrollHeight;
      }, 1100);

      elm.bind('scroll', function() {
        // note: if test for < 100 get into infinite loop due to 
        // the delayed render
        if (raw.scrollTop === 0) {
          var sh = raw.scrollHeight
          scope.$apply(attr.whenScrolled);
          // the items are not loaded and rendered yet, so
          // this math doesn't work
          raw.scrollTop = raw.scrollHeight - sh;
        }
      });
    };
  }]);
  ​

http://jsfiddle.net/digger69/FwWqb/2/

问题在于,当检索到下10个项目时,它们将被添加到列表的顶部,并且整个列表将重新呈现,并且位于列表中的项目将完全滚动到视图之外。在小提琴中,项目“
40”在顶部,当您滚动(略微向下)然后向上触发以滚动时,项目“ 90”在顶部。我正在寻找一种好的策略,在渲染后将“ 40”保持在滚动区域的顶部。

注意:在小提琴中,我可以通过在滚动事件中保存顶部li并调用scrollIntoView()使其工作, 直到 添加超时以模拟ajax调用 为止
。随着超时,在请求返回并呈现新元素之前,顶部li被滚动到视图中:/

var top = elm.find("li")[0];
scope.$apply(attr.whenScrolled);
top.scrollIntoView();

问题答案:

您可以尝试执行以下操作:http :
//jsfiddle.net/mNFmf/4/

这将滚动到div的底部:

$timeout(function() {
    raw.scrollTop = raw.scrollHeight;          
});

这将使div不会向上滚动到列表中的第一项:

var sh = raw.scrollHeight
scope.$apply(attr.whenScrolled);
raw.scrollTop = raw.scrollHeight - sh;

更新资料

为了克服ajax请求问题,请尝试使用promises。

http://jsfiddle.net/mNFmf/8/

加载程序看起来像这样:

$scope.loadMore = function() {
  var deferred = $q.defer();

  // do ajax request here and after getting the result call:   
  deferred.resolve();

  return deferred.promise;
};

在另一边:

loadMore.then(function() { 
  /* do whatever you want after the ajax request has been fulfilled */ 
});


 类似资料:
  • 我正在使用AngularJS开发一个小型web应用程序,遇到了一个问题。我正在使用填充div内部的列表。div有一个固定的高度,并设置为,这意味着当列表对于div来说太大时会出现一个滚动条。我的问题是,当重新绘制列表时,即支持ng repeat的数据会发生变化,滚动条不会重置为div的顶部。相反,它会保持在ng repeat更改之前滚动条所在的任何位置。这是一个非常糟糕的用户体验。我尝试了以下方法

  • 问题背景: 我正在使用Jasny Bootstrap的显示菜单。可以在此处找到演示: http://codepen.io/michaelbowlin/pen/lDqpm 问题是: 在我的显示菜单中,我有一个表单,它要求在点击按钮打开或关闭时,显示的面板向上滚动到顶部。以下显示滚动条处于活动状态时显示的菜单面板: 以下是菜单的菜单标记: 我已经添加了一个指令上的标记,并给这个ID的。这将调用Upda

  • 问题内容: 我正在尝试使用angularjs无限滚动 它似乎仅在滚动相对于浏览器窗口有效。 我想在内部DIV中进行无限滚动,即我有一个带有通用包装和内部div的页面,用于显示实际内容。 包装页面设置为经过整个窗口,因此它永远不会滚动。但是包含内容的内部div具有自己的滚动条。 如何使无限滚动相对于内部内容div滚动条起作用? 问题答案: 万一有人搜索相同内容并来到这里-这里是有用的链接: http

  • 问题内容: 如何对从Firebase获取的数据实施无限滚动。到目前为止,我找到了angularjs 指令,该指令确实非常有效,但是由于firebase 在单个请求中返回所有数据,我很难用fireable 实现它,这不是我想要的。 问题答案: 几周前,我做了一个JS函数,允许在我的应用程序中无限滚动。 首先,当用户访问网站时会显示一组数据: 然后,使无限滚动成为可能的函数: 最后,无限滚动: 它适用

  • 问题内容: 我在寻找解决方案时遇到了麻烦。我正在尝试使用JS(或其他库)来制作它,以便当用户在鼠标滚轮上向下滚动时,页面以与通常相反的方式滚动。 基本上,我希望页面的底部首先显示,并且随着用户滚动,我希望屏幕的顶部向下显示。我能够找到的唯一示例是http://conduit.com/的右列。 我已经建立了一个JSFiddle并提供了一个示例来帮助对其进行可视化。我知道这可能与以下内容有关: 但老实

  • 在我的Angular 2应用程序中,当我向下滚动一个页面并点击页面底部的链接时,它会改变路径并带我进入下一个页面,但它不会滚动到页面顶部。因此,如果第一页很长,而第二页的内容很少,就会给人一种第二页缺少内容的印象。因为只有当用户滚动到页面顶部时,内容才可见。 我可以在组件的ngInit中滚动窗口到页面顶部但是,有没有更好的解决方案可以自动处理我的应用程序中的所有路线?