Polymer 1.x + Firebase 2.x:如何使用 Polymerfire 将数据推送或放入 Firebase?

Polymer 1.x + Firebase 2.x: How to push or put data to Firebase using Polymerfire?

使用 Polymerfire,我想在不覆盖数据的情况下向 Firebase 添加新节点。 (我称之为 pushput 行为。)

也就是说。我想从这个开始:

状态A
my-app
 |
 - emails
    |
    + email1@example,com
    + email2@example,com

然后就此结束。

B国
my-app
 |
 - emails
    |
    + email1@example,com
    + email2@example,com
    + email3@example,com
    + email4@example,com

但是当我从状态 A 开始并执行此操作时:

<firebase-document
    id="doc"
    app-name="app"
    data="{{data}}">
</firebase-document>
...
this.$.doc.save('/', 'emails');

我结束了这个:

B国
my-app
 |
 - emails
    |
    + email3@example,com
    + email4@example,com

注意起始数据:email1@example,comemail2@example,com 已删除。

Here is the Polymerfire documentation。但是它没有在任何地方提到如何完成这种pushput类型的方法来将数据插入节点。

我怎样才能做到这一点?

编辑

:

this.$.doc('/emails');

而不是

this.$.doc('/', 'emails');

但这不起作用,因为它添加了一个随机自动密钥,如下所示:

B国
my-app
 |
 - emails
    |
    - -hvOxpxwjpWHBYGj-Pzqw
       |
       + email3@example,com
       + email4@example,com

注意添加的键:-hvOxpxwjpWHBYGj-Pzqw 从而破坏了数据结构的索引功能。

据我所知,save 方法有两种不同的处理方式:

  1. set新数据放入当前位置。
  2. push新数据放入当前位置。

为了 push 新数据,您必须不提交 key 作为 save 方法中的第二个参数:

// This will push new data into the location /emails.
this.$.doc('/emails');

// To set new data (replacing) at location /emails.
this.$.doc('/', 'emails');

希望这对 IIRC 有所帮助。如果我错了请纠正我。

我在这里假设电子邮件用作对象的键而不是数组(因为 Firebase 实时数据库中不能有数组)。如果是这样的话,你可能想要这样的东西:

<firebase-query
  id="emails"
  app-name="my-app"
  path="/emails"
  data="{{emails}}">
</firebase-query>
<script>
  // ...
  this.$.emails.ref.child('email3@example,com').set({new: 'data'});
  // ...
</script>

如果您不想实际查询电子邮件而只想插入数据,使用 JS SDK 也很简单:

firebase.database().ref('emails').child('email3@example,com').set({new: 'data'});

对于第三个选项,您可以将 <firebase-document> 与路径一起使用:

<firebase-document
  app-name="my-app"
  path="/emails/[[emailKey]]"
  data="{{emailData}}">
</firebase-document>
<script>
  // ...
  this.emailKey = 'email3@example,com';
  this.emailData = {new: 'data'};
  // ...
</script>