2013-11-20 128 views
4
$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> 

你会如何排序这些由 “标题”?我见过几个类似的问题,但解决方案似乎不起作用,至少在这种情况下。如何对AngularFire集合进行排序?

回答

4

如果$scope.items是对象数组(如所暗示的$scope.items = []),你就可以使用角orderByfilter

<!-- 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对“服务器端”进行排序。

+1

不,这似乎没有做任何事情,我甚至没有得到一个错误,当我给它一个无稽之谈的价值。 – jthomasbailey

+0

您是否将'items'作为数组存储在firebase中? – hiattp

+0

是的,使用火力地堡PHP库:https://github.com/ktamas77/firebase-php $故事=阵列( '标题'=> $标题, 'ID'=> $ ID ); $ response = $ fb-> set($ storyPath,$ story); – jthomasbailey

相关问题