AngularFire访问子元素方法

时间:2014-10-07 07:39:30

标签: firebase angularfire

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

我们说我有一个Post模型,每个帖子都有评论。这就是我获得帖子模型的方式:

var post = $firebase(new Firebase(FIREBASE_URL + "/posts/" + post_name)).$asObject();

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

post.$loaded(function () {
  var comments = post.comments;
}

现在如何在不必从Firebase单独加载模型的情况下将新元素推送到评论?我应该能够做到以下但是它不起作用:

comments.$add({text: "Hi, there"});

有没有正确的方法来获取子元素的firebase方法而不必返回服务器并获取注释?

1 个答案:

答案 0 :(得分: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();

考虑备用数据结构

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

上的避免筑巢
  

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

因此,在您的情况下,可能会产生两个顶级元素postscomments

root
  posts
    post1
    post2
  comments
    post1
      post1comment1
      post1comment2

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

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