javascript - 你如何对 AngularFire 集合进行排序?

标签 javascript angularjs firebase angularfire

  $scope.items = [];
  var ref = new Firebase("https://****.firebaseio.com/");
  var query = ref.limit(5);

  angularFire(query, $scope, "items");

<div ng-repeat="item in items" >
<span>{{item.title}}</span>
</div>

您将如何按“标题”对这些进行排序?我见过几个类似的问题,但解决方案似乎不起作用,至少对于这种情况。

最佳答案

如果 $scope.items 是一个对象数组(如 $scope.items = [] 所暗示的),您将能够使用 Angular orderBy filter :

<!-- This example will NOT work with Firebase -->
<div ng-repeat="item in items | orderBy:'title'">
  <span>{{item.title}}</span>
</div>

但是,像您那样将items 设置为数组会产生误导,因为您实际上是将“项目”存储(和检索)为键值对列表,不是数组。在 javascript 中对对象进行排序通常比较复杂,但是实现您想要的目标的一种方法是自定义过滤器:

app.filter('orderObjectBy', function(){
  return function(input, attribute) {
    if (!angular.isObject(input)) return input;

    var array = [];
    for(var objectKey in input) {
      array.push(input[objectKey]);
    }

    function compare(a,b) {
      if (a[attribute] < b[attribute])
        return -1;
      if (a[attribute] > b[attribute])
        return 1;
      return 0;
    }

    array.sort(compare);
    return array;
  }
});

现在您可以使用您的过滤器按您的任何 item 属性进行排序:

<div ng-repeat="item in items | orderObjectBy:'title'">
  <span>{{item.title}}</span>
</div>

这是一个fiddle展示。正如@bennlich 在下面指出的那样,您的自定义过滤器可以在数组转换时停止,然后您可以按照建议使用普通的 orderBy 过滤器 here .

为了彻底起见,我应该注意到您还可以使用 Firebase 对“服务器端”进行排序 priorities .

关于javascript - 你如何对 AngularFire 集合进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20109656/

相关文章:

javascript - 如何在页面加载后加载 Google 的自定义搜索引擎 (CSE) JS API?

javascript - 是否有用于 "matrix style"比较的模式?

android - 如何在不点击通知的情况下显示 Activity

javascript - 用于对象数据加载的 removeEventListener

javascript - 如何在 jquery jtable 中插入滚动条?

angularJs过滤器嵌套对象跟踪依据

javascript - 如何正确地将对象传递给自定义指令?

c# - 提交表单时不调用 Controller 函数

reactjs - React Mobx Firebase.onAuthStateChanged 监听器

javascript - Firebase 函数 : Can not read property https of undefined