【问题标题】:Unable to Update and Delete an Object from Firebase无法从 Firebase 更新和删除对象
【发布时间】:2020-01-12 03:28:50
【问题描述】:

我正在使用 Firebase 在 Angular 中开展一个项目。我无法从 Firebase 数据库更新和删除对象。

这是代表我的问题的Stackblitz Example

component.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>

【问题讨论】:

  • “无法”是什么意思?控制台日志中是否有错误? firebase 控制台中的规则(.read 和 .write 权限)是否设置正确?
  • 我得到这个“错误:Reference.update 失败:第一个参数必须是包含要替换的子对象的对象。”我已将读写权限设置为 true。

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


【解决方案1】:

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

this.course$ = this.courses.snapshotChanges().pipe(
  map((changes: any) => {
    const data = changes.map(d => ({ key: d.key, payload: d.payload.val()}))
    return data;
  })
)

那么就可以使用正确的key来更新和删除了:

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

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

然后我们需要对模板进行一些更改,我们不需要keyvalue管道:

<li *ngFor="let course of course$ | async "> {{course.payload}} </li>

你的分叉STACKBLITZ

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

【讨论】:

    【解决方案2】:

    update() 方法采用带有键值对的 JavaScript 对象

    但是在这个调用中,你传递的是一个无效的字符串值:

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

    修复取决于您在数据库中/courses/$key 下存储的内容。


    如果您在/courses/$key 下的结构是一个对象,并且看起来像这样:

    "courses": {
      "coursekey": {
        "property1": "value",
        "property2": "value"
      }
    }
    

    您可以使用以下命令更新特定属性:

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

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

    "courses": {
      "coursekey": "value"
    }
    

    你可以更新它:

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

    【讨论】:

      猜你喜欢
      • 2017-08-15
      • 2012-09-11
      • 2020-10-21
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多