属性“更新”在“订阅”类型上不存在-尝试更新Firebase数据时

时间:2019-04-11 17:19:56

标签: angular typescript firebase

我正在尝试更新Firebase数据,并且遇到错误“预订”类型上不存在“属性'更新'的错误。我可以控制台记录该对象,而它确实是我想要的对象。我只是不确定如何使用可观察对象上的“订阅”方法更新对象。

import { Injectable } from '@angular/core';
import { Post } from './models/post.model';
import { AngularFireDatabase, FirebaseListObservable } from 'angularfire2/database';

@Injectable()
export class PostService {
  posts: FirebaseListObservable<any[]>;

  constructor(private database: AngularFireDatabase) {
    this.posts = database.list('posts');
  }

  getPosts(){
    return this.posts;
  }

  getPostById(postId: string){
    return this.database.object('posts/' + postId)
  }

  updatePost(localPost){
    var postInFirebase = this.getPostById(localPost.$key).subscribe(dataLastEmittedFromObserver => {
    postInFirebase = dataLastEmittedFromObserver
    console.log(postInFirebase)
    postInFirebase.update({content: localPost.content});
  });
};

  deletePost(localPostToDelete){
    let postInFireBase = this.getPostById(localPostToDelete.$key);
    postInFireBase.remove();
  }

  addPost(newPost: Post){
    this.posts.push(newPost)
  }

}

1 个答案:

答案 0 :(得分:1)

请尝试从订阅行中删除var postInFirebase =,因为Observer.subscribe在调用异步回调之前会同步返回一个Subscription对象。这可能会导致TypeScript编译器将类型Subscription分配给变量postInFirebase并引发编译错误。

  updatePost(localPost){
    this.getPostById(localPost.$key).subscribe(dataLastEmittedFromObserver => {
      let postInFirebase = dataLastEmittedFromObserver
      console.log(postInFirebase)
      postInFirebase.update({content: localPost.content});
    });
  }

甚至更好

  updatePost(localPost){
    this.getPostById(localPost.$key).subscribe(postInFirebase => {
      postInFirebase.update({content: localPost.content});
    });
  }

您似乎对Observables的异步签名感到困惑。当您调用var value = Observable.subscribe((data) => { ...});时,value将是一个订阅,而不是观察到的数据,您只能在异步回调内部访问可观察的数据。这使我认为您的deletePost方法也不起作用。