AngularFire访问子元素方法

Mah*_*ubi 2 firebase angularfire

我正在寻找一种方法来获取子元素的方法,而不是单独加载该元素.

假设我有一个Post模型,每个帖子都有评论.这就是我获得帖子模型的方法:

var post = $firebase(new Firebase(FIREBASE_URL + "/posts/" + post_name)).$asObject();
Run Code Online (Sandbox Code Playgroud)

每个帖子都有评论,因此我可以使用以下方式访问评论

post.$loaded(function () {
  var comments = post.comments;
}
Run Code Online (Sandbox Code Playgroud)

现在,如何将新元素推送到注释,而无需从Firebase单独加载模型?我应该能够做到以下但它不起作用:

comments.$add({text: "Hi, there"});
Run Code Online (Sandbox Code Playgroud)

是否有任何正确的方法来获取子元素的firebase方法,而无需返回服务器并获取注释?

Fra*_*len 7

Firebase只会从服务器加载一次数据.之后,您的JavaScript代码可以根据需要在其上构建任意数量的引用,而无需再次下载数据.

但是post.comments.$asArray()不起作用,因为你的帖子是一个普通的JavaScript对象(而不再是$firebase同步).

而是尝试:

var ref = new Firebase(FIREBASE_URL + "/posts/" + post_name);
var post = $firebase(ref).$asObject();
var comments = $firebase(ref.child("comments")).$asArray();
Run Code Online (Sandbox Code Playgroud)

考虑替代数据结构

但您可能想重新考虑您的数据结构.尽管Firebase是一个分层数据存储,但他们建议不要构建深层嵌套的层次结构.请参阅https://www.firebase.com/docs/web/guide/structuring-data.html上的避免构建嵌套

因为我们可以嵌套深达32级的数据,所以很容易认为这应该是默认结构.但是,当我们在Firebase中获取节点的数据时,我们还会检索其所有子节点.因此,在实践中,最好保持尽可能平坦,就像构建SQL表一样.

所以在你的情况下,可能导致有两个顶级元素postscomments.

root
  posts
    post1
    post2
  comments
    post1
      post1comment1
      post1comment2
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用以下命令加载帖子及其评论:

var root= new Firebase(FIREBASE_URL);
var post = $firebase(root.child("posts").child(post_name)).$asObject();
var comments = $firebase(root.child("comments").child(post_name)).$asArray();
Run Code Online (Sandbox Code Playgroud)