0

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

控制台日志

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

同步到内存。
app-storage-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);
}

编辑

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

控制台日志截图

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

这是有问题的 firebase-document.html 文件

以下是相关的代码部分。

firebase-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);
      });
    });
  }
}
4

2 回答 2

1

我之前在“同步到内存”这个东西上也遇到过类似的问题。我所做的是直接使用 firebase.database 函数(如 add 和 set)进行更改,并且从不尝试对 <firebase-document> 中的数据进行更改。我使用 < firebase-query > 代替。如所述:https ://firebase.googleblog.com/2014/05/handling-synchronized-arrays-with-real.html

我们必须将下载的数据/数组视为只读。并使用 firebase.database 函数直接在 firebase 中进行更改。以这种方式 < firebase-query > 侦听和更新自身,这是一个循环。但是,对于使用 ID 修改特定更改,您可以使用 < firebase-query > 中添加的 arrayfromquery[0].$key 数据。我想这在某种程度上并不完全相关,但我希望它会有所帮助:)

于 2016-08-28T08:50:35.330 回答
1

的副作用this.$.document.save(this.itemsPath)pathfirebase-document将被重置为指向您在数据库中创建的新项目。但是,此代码作为path绑定到的单向,firebase-document因此每次保存数据时,您都将组件重新指向数据库中没有数据的位置。两种方式绑定和/或根本没有绑定path,或者使用显式keyinsave(parentPath, key)以便匹配的目标editableItemId可以清除您的问题。

于 2016-08-17T22:13:07.307 回答