Javascript 无法从Firebase更新和删除对象

Javascript 无法从Firebase更新和删除对象,javascript,angular,firebase,firebase-realtime-database,angularfire2,Javascript,Angular,Firebase,Firebase Realtime Database,Angularfire2,我在和Firebase合作一个项目。我无法从Firebase数据库更新和删除对象 这是一个代表我的问题 组件。ts update(course) { this.db.object('/courses/' + course.key ).update(course.value + 'updated'); } delete(course) { this.db.object('/courses/' + course.key ).remove(); } component.html &

我在和Firebase合作一个项目。我无法从Firebase数据库更新和删除对象

这是一个代表我的问题

组件。ts

update(course) {
    this.db.object('/courses/' + course.key ).update(course.value + 'updated');
}

delete(course) {
    this.db.object('/courses/' + course.key ).remove();
}
component.html

<div class="form-group mt-4">
    <input type="text" class="form-control" placeholder="Enter cource..." (keyup.enter)="add(course)" #course>
</div>
<ul class="list-group">
    <li class="list-group-item d-flex justify-content-between align-items-center" *ngFor="let course of course$ | async | keyvalue">{{course.value}} <span><button (click)="update(course)" type="button" class="btn btn-sm btn-outline-success mr-2">Update</button><button (click)="delete(course)" type="button" class="btn btn-sm btn-outline-danger">Delete</button></span></li>
</ul>

  • {{course.value}UpdateDelete

您需要收听
快照更改
以获取文档的实际密钥,您可以在更新(我在这里使用
设置
,因为它不需要对象)和删除时参考该密钥。因此,请更改获取数据的方式。通常我使用spread运算符添加有效负载数据,但由于您的有效负载只是一个字符串,因此我将其添加为变量
有效负载
(您可以选择自己的名称),并将文档id存储为

this.course$=this.courses.snapshotChanges().pipe(
映射((更改:任意)=>{
const data=changes.map(d=>({key:d.key,payload:d.payload.val()}))
返回数据;
})
)
然后,您可以使用正确的密钥更新和删除:

更新(课程){
this.db.object('/courses/'+course.key).set(course.payload+'updated');
}
删除(课程){
对象('/courses/'+courses.key).remove();
}
然后我们需要对模板进行一些更改,我们不需要
keyvalue
管道:

{{{course.payload}
你的叉子

也不要使用
任何
,输入您的数据,让您的生活更轻松

update()方法获取一个带有键值对的JavaScript对象

但在此调用中,您将传递一个无效的字符串值:

this.db.object('/courses/' + course.key ).update(course.value + 'updated');
修复取决于您在数据库的
/courses/$key
下存储的内容


如果您在
/courses/$key
下的结构是一个对象,如下所示:

"courses": {
  "coursekey": {
    "property1": "value",
    "property2": "value"
  }
}
"courses": {
  "coursekey": "value"
}
您可以使用以下命令更新特定属性:

this.db.object('/courses/coursekey').update({ property1: 'updated' });

如果您在
/courses/$key
下的结构是一个单一值,如下所示:

"courses": {
  "coursekey": {
    "property1": "value",
    "property2": "value"
  }
}
"courses": {
  "coursekey": "value"
}
您可以使用以下内容进行更新:

this.db.object('/courses/coursekey').set('updated');

“不能”是什么意思?控制台日志中是否有错误?firebase控制台中的规则(.read and.write permissions)是否设置为wright?我得到了“错误:Reference.update failed:第一个参数必须是包含要替换的子项的对象”。我已将读写权限设置为true。