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