这个问题类似于AngularFire - How do I query denormalised data?,但是我确实希望得到使用AngularFire的答案(当前版本为0.82)。
这是我使用的数据结构的一个示例:

{
  "users": {
    "user1": {
      "name": "Alice",
      "lists": {
        "list1": "true"
      }
    },
    "user2": {
      "name": "Bob",
      "lists": {
        "list2": "true"
      }
    }
  },
  "lists": {
    "list1": {
      "title": "Example"
    },
    "list2": {
      "title": "Example2"
    }
  }
}


或者,用另一种表示法:
为了获得一个用户的所有列表,我们需要所有这些:

users/$userID/lists/$listID


列表的内容存储在以下位置:

lists/$listID


我想要实现的是能够访问特定用户列表的内容,而无需“手动”遍历每个$ ListID。

更好的答案可以包括将访问权包装在AngularFire扩展服务中的代码,类似于AngularFire docs中“创建AngularFire服务”下的代码。

最佳答案

这将有助于(一如既往地)理解我们试图解决的用例,而不只是了解您为问题选择的解决方案-通常有更简单的方法来解决问题集(请参见What is the XY problem?) 。

AngularFire内置没有任何东西可以处理列表的嵌套列表。实际上,一个特定元素的列表比一个列表中引用的几个列表要容易得多。

Firebase.util

存在一个名为Firebase.util的工具来帮助进行非规范化(目前正被升级到V2,由于需要一两个月的时间),并且它与AngularFire兼容:

var fbRef = new Firebase(URL);
var indexRef = fbRef.child('users/' + userId + '/lists');
var dataRef = fbRef.child('lists');
var joinedRef = Firebase.util.intersection(indexRef, dataRef);

var lists = $firebase( joinedRef ).$asArray();


仅角度

仅限角度的方法是手动加载列表并将AngularFire用于单个列表:

app.factory('NestedList', function($firebase, $timeout) {
   return function(indexRef, dataRef) {
      var hashOfLists = {};
      indexRef.on('child_added', function(snap) {
         var key = snap.key();
         var list = $firebase( dataRef.child(key).$asArray();
         hashOfLists[key] = list;
      });
      indexRef.on('child_removed', function(snap) {
         $timeout(function() {
            delete hashOfLists[snap.key()];
         });
      });
      return hashOfLists;
   }
});


请注意,此示例使用snap.key(),但仅在使用本周刚发布的SDK版本2.x时适用。先前版本应使用snap.name()

要进行更高级的操作并创建自己的指令或服务,请查看question and answer here。尽管乍看之下可能看不到,但这是关于如何获取任何Firebase数据并将其转换为任何专有结构的相当详尽的讨论。

关于javascript - AngularFire 0.82-如何查询非规范化数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26810835/

10-09 01:48