Оберните функцию с наблюдаемой - PullRequest
0 голосов
/ 21 апреля 2019

У меня есть метод consultaPublicacoes в службе с именем bd, которая возвращает все имеющиеся у меня публикации в базе данных firebase для конкретного электронного письма пользователя.

bd.service

public consultaPublicacoes(email:string):Observable<any>{

       return this.checkarPublicacoes=new Observable((observer)=>{
           firebase.database().ref(`publicacoes/${btoa(email)}`)
           .orderByKey()
           .once('value')
           .then((snapshot:any)=>{

               let publicacoes:Array<Publicacao>=[] 


               snapshot.forEach((childSnapshot:any) => {
                    let publicacao=childSnapshot.val()
                    publicacao.key=childSnapshot.key
                    publicacoes.push(publicacao)

               });
              return publicacoes.reverse()
           }).then((publicacoes:any)=>{

                publicacoes.forEach((publicacao)=>{
                    firebase.storage().ref().child(`imagens/${publicacao.key}`).getDownloadURL()
                    .then((url:string)=>{
                        publicacao.url_imagem=url

                        firebase.database().ref(`usuario_detalhe/${btoa(email)}`).once('value')
                        .then((snapshot:any)=>{
                            publicacao.nome_usuario=snapshot.val().nome_usuario
                            })

                      })

                 })
                    observer.next(publicacoes)


            })


       })

ИУ меня также есть метод atualizarTimeLine () для publicacoesComponent, который отвечает за передачу данных, возвращаемых из Observable, в переменную this.publicacoes (PublicacoesComponent)

PublicacoesComponent

export class PublicacoesComponent implements OnInit, OnDestroy {
  public email:string
  public publicacoes:Publicacao[];
  public gostou:boolean=false;

  constructor(private bd:Bd) { }

  ngOnInit() {

    firebase.auth().onAuthStateChanged((user)=>{
      if(user!=null){
      this.email=user.email
      this.atualizarTimeLine()
      }
    })
    this.atualizarTimeLine();

  }

  public atualizarTimeLine(){
    console.log("atualizarTimeLine from publicacoes")
    this.bd.consultaPublicacoes(this.email)
    .subscribe((publicacoes:any)=>{

      console.log(publicacoes)
      this.publicacoes=publicacoes

    })

  }
....

MenuComponent

export class MenuComponent implements OnInit {

  email: string;


  constructor(private bd:Bd, private router:Router, private autenticacao:Autenticacao) { }

  ngOnInit() {
    firebase.auth().onAuthStateChanged((user)=>{
      if(user!=null){
      this.email=user.email
      this.atualizarTimeLine()
      }
    })
    this.atualizarTimeLine()
  }


  atualizarTimeLine(){
    console.log("atualizarTimeLine From MenuComponent")
    this.bd.consultaPublicacoes(this.email)
    //this.router.navigate(['/home']);
  }

Я хочу иметь возможность обновлять значение переменной publicacoes (publicacoesComponent) каждый раз, когда consultaPublicacoes вызывается из MenuComponent (this.bd.consultaPublicacoes ()), как я могу это сделать?Является ли наблюдаемый в консалте Publicacao лучшим вариантом?

1 Ответ

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

просто используйте «Subject» следующим образом .db.service: firebaseSubject = new Subject ().в консалте функции Publicacoes: firebaseSubject.next (publicacoes).publicacoesComponent: firebaseSubject.subscribe ((publicacoes) => {}).MenuComponent: this.atualizarTimeLine ();

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