Невозможно присвоить значение переменной, используя Observable, Firebase (Angular 6) - PullRequest
0 голосов
/ 18 февраля 2019

Я не могу присвоить значение любому var из возврата подписки, мое наблюдаемое имя - reportess, и я пытаюсь присвоить значение var в том же сервисе, который я объявил наблюдаемым из внешнего компонента.С другой стороны я могу распечатать по логу возврат подписки.

Сервис:

import { Injectable, Input } from '@angular/core';
//Archivo json
import _reportes from "../archivos json/reportes.json";
import _vacio from "../archivos json/vacio.json";
//Exportador pdf
import * as jsPDF from 'jspdf';
//firebase

import {AngularFirestore, AngularFirestoreCollection, AngularFirestoreDocument} from '@angular/fire/firestore';
import {Observable} from 'rxjs'
import {Subject} from 'rxjs'


@Injectable({
 providedIn: 'root'
})
export class ServicesService {
     @Input() reportes
    coleccionReporte: AngularFirestoreCollection<Reporte>;
    reportess: Observable<Reporte[]>;
    reportesMargis;
    reportesDoc: AngularFirestoreDocument<Reporte>;
    ColeccionDeReportes;
    Reporte;

    constructor(public firebase:AngularFirestore) { 
    this.reportess = firebase.collection('reporte').valueChanges(); 
    console.log(this.reportes)
}

Компонент:

constructor(private reportesServices:ServicesService) { }
    ngOnInit() {
    this.reportesServices.reportess.subscribe(data => {this.reportesServices.reportes = data} ); //dont work  
    this.reportesServices.reportess.subscribe(data => {console.log(data)} ); //work
}

Ответы [ 3 ]

0 голосов
/ 18 февраля 2019

Как заметил @Amit Chigadani выше, вы должны удалить @Input декоратор из вашей reportes собственности.Это общедоступно и будет доступно из ServicesService экземпляра.Итак, код

this.reportesServices.reportess.subscribe(data => {
    this.reportesServices.reportes = data
});

должен работать.Ваш console.log(this.reportes) показывает undefined, потому что эта строка выполняется до разрешения наблюдаемой.


Однако такая логика выглядит немного странно, потому что служебный материал выполняется вне службы.Я бы предложил немного изменить код вашего сервиса:

import {tap} from 'rxjs/operators';

this.reportess = firebase.collection('reporte').valueChanges().pipe(
    tap(data => this.reportes = data)
); 

, чтобы хранение осуществлялось внутри сервиса.

0 голосов
/ 19 февраля 2019

РЕШИТЬ!Спасибо за ответы на все вопросы.Я объявил «тест» с «пусть».В сервисе я объявил метод для принудительного приведения полученных данных к моим объектам.

компонент:

 constructor(private reportesServices:ServicesService) { }

      ngOnInit() {
        let test: any

        this.reportesServices.reportess.subscribe(
          data => {
            test = data;
            this.reportesServices.setReporters(test);
          });         
      }

Сервис:

setReporters(data){
    this.reportes  = [];
    for(let i = 0; i < data.length; i++)
    {
      let reporte:Reporte = {
        titulo: data[i].titulo,
        fecha: data[i].fecha,
        ruta: data[i].ruta,
        prioridad: data[i].prioridad,
        funcion: data[i].funcion,
        comentario: data[i].comentario,
        solucionado: data[i].solucionado    
      };
      this.reportes.push(reporte)
    }  
  }
0 голосов
/ 18 февраля 2019

Вы не можете использовать @Input() для service свойств.Просто удали это.

Он должен использоваться только в component или directive.

export class ServicesService {
      reportes;  // removed input decorator
      coleccionReporte: AngularFirestoreCollection<Reporte>;
      reportess: Observable<Reporte[]>;
      reportesMargis;
      reportesDoc: AngularFirestoreDocument<Reporte>;
      ColeccionDeReportes;
      Reporte;



     ..........
}
...