【问题标题】:Firebase Atmonic Add and delete entryFirebase Atmonic 添加和删除条目
【发布时间】:2017-02-12 09:52:26
【问题描述】:

我的 firebase 中有以下数据结构

-ActionSheet
    -PendingApproval 
        -SomeKey1
            -someData
            -someData
            -someData
        -SomeKey2
            -someData
            -someData
            -someData
    -Approved
        -SomeKey3
            -someData
            -someData
            -someData

当屏幕出现时,将向用户显示pendingApproval 中的所有项目。 当用户在其中一个条目上单击批准时,我想将数据从“PendingApproval”移动到“Approved”节点。

说如果用户点击了SomeKey1的批准,目前,我正在这样做

1. Duplicate the data to Approved node 

2. Upon success, delete the entry SomeKey1 from PendingApproval 

但是,第一步成功而第二步失败的可能性很小。在这种情况下,我的数据库中有两个 SomeKey1

我想知道是否有办法自动执行此操作,以保证操作同时成功或失败。

我刚刚阅读了Firebase Atmoic,他们只提到了原子更新,而不是“设置+删除”。

下面是我的代码

// save data to firebase
saveoFirebase_approved(myData: Object, key: string) {
    let savePath = '/ActionSheet/Approved/' + key;
    return this.af.database.object(savePath).set(myData);
}

// remove pending approval from firebase
removePendingFromFirebase(myData: Object) {
    let savePath = '/ActionSheet/PendingApproval/' + key;
    return this.af.database.object(savePath).remove();
}


this.databaseService.saveoFirebase_approved(data, key)
  .then(result => {

    // delete pending from firebase
    this.databaseService.removePendingFromFirebase(data)
      .then(result => {
        // both action completed
      })
      .catch(error => {
        // something went wrong deleting item from firebase
      })
  })
  .catch(error => {
    // something went wrong saving to firebase
  })
 }

注意:我正在使用 Angular 2 和 AngularFire

【问题讨论】:

    标签: javascript angular firebase firebase-realtime-database angularfire


    【解决方案1】:

    您可以通过将null 设置为位置来删除多位置更新中的数据。那么你的操作就变成了:

    var updates = {
      'PendingApproval/SomeKey1': null,
      'Approved/SomeKey1': {
        SomeDate: 'Value'
      }
    };
    ref.child("ActionSheet").update(updates);
    

    您甚至可以在您的安全规则中验证数据只能写入 Approved,前提是它之前处于待处理状态,现在不再处于待处理状态:

    "Approved": {
      "$key": {
        ".write": "data.parent().parent().child('PendingApprocal').child($key).exists()
            && !newData.parent().parent().child('PendingApprocal').child($key).exists()"
    

    【讨论】:

    • 完美运行。似乎没有办法用角度火来做到这一点,但将它集成到我的应用程序中同样容易。谢谢。
    【解决方案2】:

    【讨论】:

    • 我以前从未使用过事务。但是在查看文档之后,这似乎不是要走的路吗?因为我不是“处理可能被并发修改破坏的数据,例如增量计数器,所以您可以使用事务操作。” (来自文档)。我还用我的代码更新了这个问题,以帮助更好地说明需求。干杯
    猜你喜欢
    • 2018-10-30
    • 1970-01-01
    • 2017-04-23
    • 2021-10-24
    • 1970-01-01
    • 2016-07-24
    • 2015-09-18
    • 1970-01-01
    相关资源
    最近更新 更多