AngularFire2 - 通过 Observable 删除项目 - 最后一个项目不会从 UI 中删除

标签 angular firebase angularfire2

我想知道为什么当我运行此函数时,该项目会从我的 Firebase 数据库中删除,但在我的 Angular 2 应用程序中,当它到达最后一个条目时,它会从数据库中删除它,但不会删除它来 self 的 *ngFor 循环中的列表。但是,如果我刷新页面,列表就会更新,并且该条目不再存在。有人知道为什么会发生这种情况吗?

这是我的提供程序中用于删除附件的功能:

removeAttachment(attachment, projectId, requestId) {
    return this._af.database.list(`/check_requests/${projectId}/${requestId}/attachments/${attachment.id}`).remove();
  }

以下是我的组件中的关联数组:

public attachments: any = [];
public attachmentKeys:any = [];

这是一个异步函数,每当数据库更新时,它都会填充 attachmentsattachmentKeys 数组:

populateFormWithRequest() {
    this.formPopulationObs = this._checkRequests.getRequest(requestId, projectId).subscribe(requestData => {

      // Get the attachments
      if(requestData['attachments']) {
        this.attachments = requestData['attachments'];
        this.attachmentKeys = Object.keys(requestData['attachments']);
      }
   });
}

这是我的 html 模板中的 *ngFor 循环:

<ul class="attachment-list" *ngIf="attachments && (attachments | mapToIterable).length > 0">
          <li *ngFor="let key of attachmentKeys">
            <a target="_blank" href="{{attachments[key].url}}"><i class="fa fa-paperclip"></i>{{attachments[key].name}}</a>
            <button (click)="removeAttachment(attachments[key], key)"><i class="fa fa-times"></i></button>
          </li>
        </ul>

最佳答案

很可能是这一行:

if (requestData['attachments']) {

当您删除最后一个附件时,发出的请求对象中将不存在attachments 属性。如果 Firebase 数据库中的子级没有子级,它也会被删除。

因此 requestData['attachments'] 将为 false,并且 attachmentsattachmentKeys 属性将保持不变。

解决方案是这样的:

if (requestData['attachments']) {
  this.attachments = requestData['attachments'];
  this.attachmentKeys = Object.keys(requestData['attachments']);
} else {
  this.attachments = {};
  this.attachmentKeys = [];
}

关于AngularFire2 - 通过 Observable 删除项目 - 最后一个项目不会从 UI 中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43152598/

相关文章:

javascript - 通过更新 ref() 增加项目

Firebase 数据与 Observable 连接

angular - 如何将段设置为 Angular 6 路线?

angular - 使用angular6的Http get方法

firebase - 当我在 GitHub 上创建新存储库时,我应该隐藏 Firebase(或其他后端)代码的哪些部分?

Javascript Observable 无限循环

Firebase 云函数设置超时 540 秒但以 60 秒结束

javascript - 无法将复选框值推送到数组

javascript - Angular 2 使用不同的 url 路由到同一组件

ios - 在范围内找不到类型 GIDSignInDelegate