【问题标题】:AngularFire Accessing child element methodsAngularFire访问子元素方法
【发布时间】:2014-10-07 07:39:30
【问题描述】:

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

假设我有一个 Post 模型,每个帖子都有 cmets。这就是我获得帖子模型的方式:

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

每个帖子都有 cmets,所以我可以使用以下方法访问 cmets:

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

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

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

是否有任何适当的方法来获取子元素的 firebase 方法,而无需返回服务器并获取 cmets?

【问题讨论】:

  • Firebase 只会加载一次数据。之后,您可以根据需要在其上构建任意数量的参考,而无需再次下载数据。所以在这种情况下,只需将comments 也作为$asArray() 拉下来。
  • 我用 post.cmets.$asArray() 尝试过 $asArray() ,但没有成功。我问这个问题的原因是因为我不想再次下载数据来执行操作,但是如果我找不到任何其他方式,我可能最终会这样做。
  • 正如我已经说过的:Firebase 只会下载一次数据,无论您为其创建了多少引用。但是post.comments.$asArray() 将不起作用,因为您的post 是一个普通的JavaScript 对象(不再是$firebase 同步)。而是尝试$firebase(new Firebase(FIREBASE_URL + "/posts/" + post_name + "comments")).$asArray();
  • 哦,我现在明白了!非常感谢。
  • 也把它写在一个答案中,这样可以进行更多解释。

标签: firebase angularfire


【解决方案1】:

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

但是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

然后您可以简单地加载帖子及其 cmets:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 2011-10-25
    • 1970-01-01
    • 2019-01-17
    相关资源
    最近更新 更多