Polymer 1.x + Firebase 2.x: Как отправить или поместить данные в Firebase с помощью Polymerfire?

Используя Polymerfire, я хочу добавить новые узлы в Firebase без перезаписи данных. (Я называю это push или же put поведение.)

Другими словами. Я хочу начать с этого:

Состояние А
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,com а также email2@example,com были удалены

Вот документация Polymerfire. Но нигде не упоминается, как достичь этого типа push или же putметод для вставки данных в узел.

Как я могу сделать это?

редактировать

Ответ @motss предполагает:

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

вместо

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

Но это не работает, потому что добавляет случайный автоматический ключ следующим образом:

Состояние B
my-app
 |
 - emails
    |
    - -hvOxpxwjpWHBYGj-Pzqw
       |
       + email3@example,com
       + email4@example,com

Обратите внимание на добавленный ключ: -hvOxpxwjpWHBYGj-Pzqw тем самым разрушает функцию индексации структуры данных.

2 ответа

Решение

Здесь я собираюсь предположить, что электронные письма используются в качестве ключей для объектов и не являются массивом (поскольку вы не можете иметь массивы в базе данных реального времени 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>

Насколько я знаю, 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. Поправьте меня если я ошибаюсь.

Другие вопросы по тегам