从订阅返回起,我无法将值分配给任何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
}
答案 0 :(得分:1)
您不能将@Input()
用于service
属性。删除它。
只能在component
或directive
中使用。
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)
}
}