【问题标题】:AngularFire: How to filter a synchronized array?AngularFire:如何过滤同步数组?
【发布时间】:2014-08-10 00:47:09
【问题描述】:

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

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 的最佳方式吗?

【问题讨论】:

  • 项目是在多个用户之间共享,还是每个项目都是唯一的并且只分配给一个用户?
  • @Kato 每个项目都分配给一个用户。

标签: angularjs firebase angularfire


【解决方案1】:

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

/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();

但一般来说,走第一条路线是最安全、最简单的。

【讨论】:

  • 谢谢加藤,firebase-util 看起来很有趣,我去看看!
  • 它很方便,但是因为它是客户端,所以它不如只为每个用户存储项目那么干净或快速。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-10
  • 2020-09-11
  • 1970-01-01
  • 2015-01-23
  • 1970-01-01
  • 2018-10-26
相关资源
最近更新 更多