Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firebase Atmonic添加和删除条目_Javascript_Angular_Firebase_Firebase Realtime Database_Angularfire - Fatal编程技术网

Javascript Firebase Atmonic添加和删除条目

Javascript Firebase Atmonic添加和删除条目,javascript,angular,firebase,firebase-realtime-database,angularfire,Javascript,Angular,Firebase,Firebase Realtime Database,Angularfire,我的firebase中有以下数据结构 -ActionSheet -PendingApproval -SomeKey1 -someData -someData -someData -SomeKey2 -someData -someData -someData -Approved -SomeK

我的firebase中有以下数据结构

-ActionSheet
    -PendingApproval 
        -SomeKey1
            -someData
            -someData
            -someData
        -SomeKey2
            -someData
            -someData
            -someData
    -Approved
        -SomeKey3
            -someData
            -someData
            -someData
当屏幕出现时,将显示用户,且所有项目均处于等待批准状态。 当用户单击其中一个条目上的approve时,我想将数据从“PendingApproval”节点移动到“Approved”节点

假设用户单击approved for SomeKey1,当前,我正在按照以下方式进行操作

1. Duplicate the data to Approved node 

2. Upon success, delete the entry SomeKey1 from PendingApproval 
然而,第一步成功而第二步失败的可能性很小。在这种情况下,我的数据库中有两个SomeKey1

我想知道是否有一种方法可以以原子方式执行此操作,从而保证操作同时成功或失败

我刚刚读过,他们只提到原子更新,而不是“设置+删除”

下面是我的代码

// 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
  })
 }

注意:我将AngularFire与AngularFire一起使用Angular 2

我相信您正在寻找所谓的事务


我相信您正在寻找所谓的交易


您可以通过将
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()"

通过将
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()"

我以前从未使用过transaction。但是看了这些文件后,这似乎不是一个好办法?由于我不是“处理可能被并发修改(如增量计数器)损坏的数据,您可以使用事务操作。”(来自文档)。我还用我的代码更新了这个问题,以帮助更好地说明这个需求。我以前从未使用过事务处理。但是看了这些文件后,这似乎不是一个好办法?由于我不是“处理可能被并发修改(如增量计数器)损坏的数据,您可以使用事务操作。”(来自文档)。我还用我的代码更新了这个问题,以帮助更好地说明这个需求。啦啦队打得很好。似乎没有办法用角火来完成,但将其集成到我的应用程序中也同样容易。谢谢,很好用。似乎没有办法用角火来完成,但将其集成到我的应用程序中也同样容易。谢谢