我正在寻找一种方法来获取子元素的方法,而不是单独加载该元素。
我们说我有一个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方法而不必返回服务器并获取注释?
答案 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表一样。
因此,在您的情况下,可能会产生两个顶级元素posts
和comments
。
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();