AngularFire:如何过滤同步数组?

时间:2014-08-10 00:47:10

标签: angularjs firebase angularfire

考虑一组项目和用户。每个用户可以拥有一个或多个项目。这些项目可能非常大,但每个用户通常都会有少量项目。

app:
  items:
    item1:
      name: 'table'
      color: 'white'
      createdAt: '2014-08-09T12:54:58.803Z'
    item2:
      name: 'macbook air'
      color: 'silver'
      createdAt: '2014-06-09T12:54:58.803Z'
    item3:
      name: 'firebase t-shirt'
      color: 'yellow'
      createdAt: '2014-07-09T12:54:58.803Z'
  users:
    user1:
      items:
        item1: true
        item3: true
    user2:
      items:
        item2: true

给定用户ID,例如user1,我想显示一个用户列表,按createdAt排序:

yellow firebase t-shirt
white table

Firebase服务器上的每次更新都应反映在应用视图中。

我想这个视图应该是这样的:

<div ng-repeat="item in items | orderBy:'createdAt'">
  {{ item.color }} {{ item.name }}
</div>

但是,我无法找到一种简单的方法来设置$scope.items

这就是我目前所做的事情:

var userItemsRef = new Firebase(FIREBASE_ROOT + '/users/user1/items');
$scope.userItems = $firebase(userItemsRef).$asArray();

$scope.userItems.$loaded(function() {
  $scope.userItems.$watch(setItems);
  setItems();
});

function setItems() {
  var promises = $scope.userItems.map(function(userItem) {
    var itemRef = new Firebase(FIREBASE_ROOT + '/items/' + userItem.$id);

    return $firebase(itemRef).$asObject().$loaded();
  });

  $q.all(promises).then(function(items) {
    $scope.items = items;
  });
}

这是使用AngularFire的最佳方式吗?

1 个答案:

答案 0 :(得分:2)

用户存储项目可能最简单。所以这样的结构:

/app/items/$user_id/$item_id/...

这将允许像这样检索属于特定用户的项目:

var userId = 'user1';
var ref = new Firebase(FIREBASE_ROOT + '/items/' + userId);
$scope.items = $firebase(ref).$asArray();

如果这是不可能的,因为项目是在用户之间共享的,所以使用join lib可能最简单。

var userId = 'user1';
var userIndexRef = new Firebase(FIREBASE_ROOT + '/users/' + userId + '/items');
var itemsRef = new Firebase(FIREBASE_ROOT + '/items/');
var ref = Firebase.util.intersection(userIndexRef, itemsRef);
$scope.items = $firebase(ref).$asArray();

但一般来说,采取第一条路线是最安全和最简单的。