无法使用Observable,Firebase(角度6)将值分配给var

时间:2019-02-18 11:36:50

标签: angular typescript firebase google-cloud-firestore observable

从订阅返回起,我无法将值分配给任何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 :(得分:1)

您不能将@Input()用于service属性。删除它。

只能在componentdirective中使用。

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



     ..........
}

答案 1 :(得分:0)

正如@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)
); 

因此存储将在服务内部处理。

答案 2 :(得分:0)

已解决! 感谢所有的答案。 我用“ let”声明了“ test”。在服务中,我声明了一种强制将接收到的数据强制转换为对象的方法。

组件:

 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)
    }  
  }