考虑一组项目和用户。每个用户可以拥有一个或多个项目。这些项目可能非常大,但每个用户通常都会有少量项目。
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的最佳方式吗?
答案 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();
但一般来说,采取第一条路线是最安全和最简单的。