AngularFire:如何筛选同步阵列? [英] AngularFire: How to filter a synchronized array?

查看:99
本文介绍了AngularFire:如何筛选同步阵列?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

考虑一组项目和用户。每个用户可以有一个或多个项。一组项目可以说是相当大的,但每一个用户通常会有项目的量小。

Consider a set of items and users. Each user can have one or more items. The set of items can be quite big, but every user will normally have small amount of items.

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 排序的列表:

Given a user id, e.g. user1, I would like to display a list of user's items, sorted by createdAt:

yellow firebase t-shirt
white table

的火力地堡服务器上的每次更新都应该反映在应用视图。

我猜认为应该是这样的:

I guess the view should look like this:

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

Is this the best way to utilize AngularFire?

推荐答案

这很可能是最简单的用户存储的项目。因此,这样的结构:

It would probably be simplest to store the items by user. So a structure like this:

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

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

This would allow for the items belonging to a particular user to be retrieved like so:

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

如果这是不可能的,因为数据项都在用户之间共享的,它可能是最简单的使用一个加入LIB

If this isn't possible, because items are shared between users, it's probably simplest to use a 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();

但是总体来说,这是最安全和最简单的走第一条路线。

But generally, it's safest and simplest to take the first route.

这篇关于AngularFire:如何筛选同步阵列?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆