如何在 Angular2 中使用 AngularFire2 或 Firebase 进行多位置 "remove"
How to do a multi-location "remove" with AngularFire2 or Firebase in Angular2
我想 运行 一个组合操作,在一次操作中删除 Firebase 上的 2 个节点。如果我有节点位置,我知道有 remove() 来删除节点。但是什么是remove()操作return?承诺还是可观察?我如何知道删除操作成功,以便我可以 运行 其他删除操作或告诉我的组件删除操作成功(或有错误)?
示例提供(需要 AngularFire 的多位置删除帮助):
constructor(private db:AngularFireDatabase, @Inject(FirebaseRef) fb) {
this.sdkDb = fb.database().ref();
}
deleteTask(taskId: string, jobtypeId: string): boolen {
const taskObservable = this.db.object('tasks' + '/' + taskId);
const taskPerJobtypeObervable = this.db.object('tasksPreJobtype' + '/' + jobtypeId + '/' + taskId);
taskObservable.remove()
.then(_ => {
console.log('success');
taskPerJobtypeObervable.remove()
.then(_ => {
return ture
});
})
.catch(err => {console.log(err, 'You dont have access!'), return false});
}
如您所见,我需要将删除作为一个承诺进行链接,我真的很想避免这种情况。我希望这是可观察的模式,因为我使用 angularFire2。因此,我不想 return 一个布尔值,而是 return 一个可观察值。我希望这是多位置删除。我该如何重构这段代码?太感谢了!
感谢 Frank,我想我找到了解决方案并在这里分享解决方案:
想法是对 "null" 的两个位置都使用 update(),它将在 Firebase 中摆脱它。
重构代码如下:
deleteTask(taskId: string, jobtypeId: string): Observable<any> {
let dataToDelete = {};
dataToDelete['tasks/' + taskId] = null;
dataToDelete['tasksPreJobtype/' + jobtypeId + '/' + taskId] = null;
return this.firebaseUpdate(dataToDelete);
}
firebaseUpdate(dataToSave) {
const subject = new Subject();
this.sdkDb.update(dataToSave)
.then(
val => {
subject.next(val);
subject.complete();
},
err => {
subject.error(err);
subject.complete();
}
);
return subject.asObservable();
}
有了它,我的组件可以轻松订阅 deleteTask 并仅在 deleteTask return 为真时执行重定向或其他选项。反应式编程 VS Promise 的力量 :)
我想 运行 一个组合操作,在一次操作中删除 Firebase 上的 2 个节点。如果我有节点位置,我知道有 remove() 来删除节点。但是什么是remove()操作return?承诺还是可观察?我如何知道删除操作成功,以便我可以 运行 其他删除操作或告诉我的组件删除操作成功(或有错误)?
示例提供(需要 AngularFire 的多位置删除帮助):
constructor(private db:AngularFireDatabase, @Inject(FirebaseRef) fb) {
this.sdkDb = fb.database().ref();
}
deleteTask(taskId: string, jobtypeId: string): boolen {
const taskObservable = this.db.object('tasks' + '/' + taskId);
const taskPerJobtypeObervable = this.db.object('tasksPreJobtype' + '/' + jobtypeId + '/' + taskId);
taskObservable.remove()
.then(_ => {
console.log('success');
taskPerJobtypeObervable.remove()
.then(_ => {
return ture
});
})
.catch(err => {console.log(err, 'You dont have access!'), return false});
}
如您所见,我需要将删除作为一个承诺进行链接,我真的很想避免这种情况。我希望这是可观察的模式,因为我使用 angularFire2。因此,我不想 return 一个布尔值,而是 return 一个可观察值。我希望这是多位置删除。我该如何重构这段代码?太感谢了!
感谢 Frank,我想我找到了解决方案并在这里分享解决方案:
想法是对 "null" 的两个位置都使用 update(),它将在 Firebase 中摆脱它。
重构代码如下:
deleteTask(taskId: string, jobtypeId: string): Observable<any> {
let dataToDelete = {};
dataToDelete['tasks/' + taskId] = null;
dataToDelete['tasksPreJobtype/' + jobtypeId + '/' + taskId] = null;
return this.firebaseUpdate(dataToDelete);
}
firebaseUpdate(dataToSave) {
const subject = new Subject();
this.sdkDb.update(dataToSave)
.then(
val => {
subject.next(val);
subject.complete();
},
err => {
subject.error(err);
subject.complete();
}
);
return subject.asObservable();
}
有了它,我的组件可以轻松订阅 deleteTask 并仅在 deleteTask return 为真时执行重定向或其他选项。反应式编程 VS Promise 的力量 :)