【问题标题】:How to make ngInfiniteScroll retrieve data by createdAt Descending如何使 ngInfiniteScroll 通过 createdAt Descending 检索数据
【发布时间】:2016-07-23 08:18:30
【问题描述】:

我正在使用 firebase 保存具有以下数据的帖子:

createdAt: "Sun Apr 03 2016 18:32:46 GMT-0300 (BRT)"

我想要实现的是首先获取最新的帖子,然后在用户向下滚动时加载较旧的帖子。

使用 ngInfiniteScroll 检索帖子后,我可以使用 <div ng-repeat="post in posts | orderBy:'-createdAt'"> 订购 desc,但 ngInfiniteScroll 会继续首先返回旧帖子。我正在订购,但我订购的是旧的。

我已经尝试在 ngInfiniteScroll 中使用相同的逻辑 ("-createdAt"),但效果不佳。


我的 js 差不多是这样的:

  var baseRef = new Firebase(FBURL).child("posts");
  var scrollRef = new Firebase.util.Scroll(baseRef, "createdAt");
  $scope.posts = $firebaseArray(scrollRef);
  $scope.posts.scroll = scrollRef.scroll;

安全和规则:

"posts": {
          ".read": true,
          ".indexOn": "createdAt",
          "$post": {
            ".read": true,
            ".write": true,
            "$other": {
               ".validate": true
            }
         }
      }

【问题讨论】:

  • 我认为您的问题是,您按日期作为字符串而不是作为 Date 对象进行排序。看看这个答案:stackoverflow.com/a/25306447/752142.
  • @illagrenan 我的 orderBy 工作正常...或者您是说将其更改为 Date ngInfiniteScroll 将识别"-createdAt"
  • 因此,如果您只是使用简单的 ngRepeat 在没有 ngInfiniteScroll 的情况下打印它们,那么您的项目是否正确排序?如果您使用infinite-scroll='someService.nextPage()' 项目没有订购?我对么?简单的解决方案可能是:从 API 检索项目,在您的服务/控制器中订购它们,然后从 infinite-scroll='myMethod()' 返回订购的数据。
  • 对。今天它对使用 ngInfiniteScroll 检索的数据集进行排序,但它们首先是较旧的数据集。我想先获取新的集合,这就是我对 ngInfiniteScroll 的期望...... >
  • 我对 firebase 不是很熟悉,但是,使用 ngInfiniteScroll 会加载远程数据。因此,如果您希望它按特定顺序排列,则需要在 firebase 查询中指定它。一些快速搜索将我引向orderByChild 方法。同样根据我的发现,Firebase 没有日期类型,因为它是 JSON。您需要将 createdAt 设置为表示日期的原始类型 (createdAt: date.getTime())。然后我认为你可以做类似ref.orderByChild("-createdAt").

标签: angularjs nginfinitescroll


【解决方案1】:

在深入研究可用文档后,我发现了一个丑陋的解决方法here

基本上是使用负时间戳,正常检索createdAt(升序)。

因此,在保存数据时,我正在执行以下操作:

{
  createdAt: Firebase.ServerValue.TIMESTAMP,
  createdAtDesc: 0 - Date.now()
}

仍在寻找更好的解决方案。

【讨论】:

    【解决方案2】:

    看起来您找到了解决方案,但您使用 orderBy 的方法是正确的,但只需尝试稍微调整一下即可。尝试使用orderBy:'+':true",其中orderBy 表示您想通过某些东西订购它,+:true 表示在顶部有任何新内容的地方订购它,-:true 表示在底部订购新内容。但是您可以查看 angular 文档here。因此,如果在 HTML 端处理它,它看起来像这样 ng-repeat="post in posts| orderBy:'+':true" 或:

        <div ng-repeat="post in posts| orderBy:'+':true">
               [....post info here]
          </div>
    

    试试看吧,希望对你有帮助。

    【讨论】:

    • 关于您的解决方案如何解决问题的更多详细信息如何?
    • 我想通过 createdAt desc 来订购它在哪里传递?
    • Firebase 已按创建时间的顺序为您添加新帖子。当您将任何新帖子添加到您的 firebase 数组时,您会注意到它会添加到堆栈的底部。因此,当您填充 $scope.posts 时,就像您在这里所做的那样,$scope.posts = $firebaseArray(scrollRef); firebase 会以相同的顺序将它们推送到您的 $scope.posts 变量中。
    • 即使较小的帖子在较大的帖子之前加载几毫秒到$scope.posts,它仍然会按顺序将较大的帖子放在前面。我不能说同样的话(因为我没有尝试过)如果你将它们保存在 firebase 末端,就像一个对象的路径不是它们的预生成字符串(如-KFC4qa-dn3r),但你这样做的方式我认为也很好,我不认为这是一个“丑陋的解决方法”,虽然可能是多余的,因为它已经由 firebase 为你处理,但现在有了你的时间戳,你可以使用像 github.com/wildlyinaccurate/angular-relative-date 这样的东西
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    相关资源
    最近更新 更多