Свойство «Обновление» не существует для типа «Подписка» - при попытке обновить данные Firebase - PullRequest
0 голосов
/ 11 апреля 2019

Я пытаюсь обновить данные Firebase, и я сталкиваюсь с ошибкой «Свойство update» не существует для типа «подписка». Я могу консоль записать в журнал объект, и это действительно тот объект, который я хочу. Я просто не уверен, как я могу обновить объект, используя метод «подписки» на наблюдаемой.

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 Ответ

1 голос
/ 11 апреля 2019

Попробуйте удалить 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 метод также не будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...