Polymer + Firebase:firebase-document,数据被覆盖?

时间:2016-08-17 21:37:38

标签: firebase polymer firebase-realtime-database polymer-1.0 firebase-polymer

我想使用firebase-document将数据保存到我的firebase。看来数据已正确保存但会立即被覆盖。以下是我得到的错误......

的console.log
  

与内存同步。   
从Firebase值更新数据:对象{comment:“foo”,日期:“bar”,id:“ - XXXXxxxxXXXXXXxxxx”,商家:“baz”,状态:“bat”......}   
APP-存储behavior.html:368

     

与内存同步。   
APP-存储behavior.html:350   
从Firebase值更新数据:对象{date:“”}

在日志中查看第二段?这是我不希望看到的。可能是什么导致了这个?我能做些什么来实现我想要的行为?这是我的代码......

X-el.html
<firebase-document
    id="document"
    app-name="my-firebase"
    data="{{editableItem}}"
    log>
</firebase-document>
...
save: function() {
  return this.$.document.save(this.itemsPath);
}

修改

这是控制台日志的屏幕截图。

Screenshot of console log

查看第二个同步到内存日志。它描述了写一个基本上是空对象:{date:""}到内存(firebase)。此操作将覆盖上一个对象:{comment: "c", date: "", merchant: "c", status: "new", total: "3"}写入同一位置。

Here is the firebase-document.html file in question

以下是相关的代码部分。

火力点,document.html
attached: function() {
  this.__refChanged(this.ref, this.ref);
},

detached: function() {
  if (this.ref) {
    this.ref.off('value', this.__onFirebaseValue, this);
  }
},

observers: [
  '__refChanged(ref)'
],

...

__refChanged: function(ref, oldRef) {
  if (oldRef) {
    oldRef.off('value', this.__onFirebaseValue, this);
  }
  if (ref) {
    ref.on('value', this.__onFirebaseValue, this);
  }
},

__onFirebaseValue: function(snapshot) {
  var value = snapshot.val();
  if (value == null) {
    value = this.zeroValue;
  }
  if (!this.new) {
    this.async(function() {
      this.syncToMemory(function() {
        this._log('Updating data from Firebase value:', value); // Causes overwrite
        this.set('data', value);
      });
    });
  }
}

2 个答案:

答案 0 :(得分:1)

this.$.document.save(this.itemsPath)的副作用是path的{​​{1}}将重置为指向您在数据库中创建的新项目。但是,此firebase-document代码只能绑定到path,因此每次保存数据时,您都会将组件重新分配到数据库中没有数据的位置。双向绑定和/或不绑定firebase-document,或使用path中的明确key,以便匹配save(parentPath, key)的目标应该清除您的问题。

答案 1 :(得分:1)

我之前遇到类似的问题'与内存同步'的问题。我所做的是直接使用firebase.database函数(如add和set)进行更改,并且从不尝试对&lt;中的数据进行更改。 firebase-document&gt;。我使用&lt; firebase-query&gt;代替。如:https://firebase.googleblog.com/2014/05/handling-synchronized-arrays-with-real.html

中所述

我们必须将下载的数据/数组视为ReadOnly。并使用firebase.database函数直接在firebase中进行更改。以这种方式&lt; firebase-query&gt;听取并更新自己,这是一个循环。为了使用ID修改特定的更改,有一个添加的arrayfromquery [0]。来自&lt;的$ key数据。 firebase-query&gt;您可以使用。我想这不是完全相关的,但我希望它有所帮助:)