【问题标题】:get a function from a service Firestore从服务 Firestore 获取功能
【发布时间】:2017-12-21 04:12:39
【问题描述】:

如何在服务中的组件中使用函数?我正在尝试使用:

 addProyecto(proyecto: Proyecto) {
    this.proyectosCollection.add(this.proyecto);
}

但它返回此错误:TypeError: Cannot read property 'add' of undefined at ProyectosService.addProyecto

我想要的是在 Firestore 的集合中添加一个文档,我可以从同一个组件中做到这一点,但我不能使用服务来做到这一点。

有什么想法吗?

proyecto.ts

export interface Proyecto {
    titulo?: string;
    destacado?: string;
    descripcion?: string;
}

export interface ProyectoId extends Proyecto {
    id: string
};

proyecto.service.ts

import { Injectable } from '@angular/core';
import { Proyecto } from './proyecto';

//Firestore
import { AngularFirestore, AngularFirestoreCollection, AngularFirestoreDocument } from 'angularfire2/firestore';
import { Observable } from 'rxjs/Observable';


@Injectable()
export class ProyectosService {

    proyecto: Proyecto = {};
    proyectosCollection: AngularFirestoreCollection<Proyecto>;
    proyectosObservable: Observable<Proyecto[]>;

    constructor(private afs: AngularFirestore) { 

    }

    getProyectos() {
        this.proyectosCollection = this.afs.collection('proyectos', ref => ref.orderBy('titulo'));

        this.proyectosObservable = this.proyectosCollection.snapshotChanges().map(arr => {
            return arr.map(snap => {
                const data = snap.payload.doc.data() as Proyecto;
                const id = snap.payload.doc.id;
                return { id, ...data };
            });
        });
        return this.proyectosObservable;
    };

    addProyecto(proyecto: Proyecto) {
        this.proyectosCollection.add(this.proyecto);
    }

}

crear-proyecto.component.ts

import { Component, OnInit } from '@angular/core';
import { ProyectosService } from '../proyectos.service';
import { Proyecto } from '../proyecto';

import { Observable } from 'rxjs/Observable';
import { AngularFirestoreCollection, AngularFirestore } from 'angularfire2/firestore';


@Component({
    selector: 'app-crear-proyecto',
    templateUrl: './crear-proyecto.component.html',
    styleUrls: ['./crear-proyecto.component.scss'],
    providers: [ProyectosService]
})
export class CrearProyectoComponent implements OnInit {


    proyecto: Proyecto = {};
    proyectosCollection: AngularFirestoreCollection<Proyecto>;
    proyectosObservable: Observable<Proyecto[]>;

    constructor(private sp: ProyectosService, private afs: AngularFirestore) {}

    ngOnInit() {
    }

    agregarProyecto() {
        this.sp.addProyecto(this.proyecto)
    }
}

【问题讨论】:

    标签: angular typescript firebase google-cloud-firestore


    【解决方案1】:

    您的this.proyectosCollection 未定义,因为您在函数getProyectos() 中定义了它。在调用此函数之前,它将是未定义的。

    将您的收藏移至 proyecto.service.ts

    中的 ngOnInit()
    ngOnInit() {
        this.proyectosCollection = this.afs.collection('proyectos', ref => ref.orderBy('titulo'));
    }
    

    你的 get 函数看起来像这样

    getProyectos() {
        this.proyectosObservable = this.proyectosCollection.snapshotChanges().map(arr => {
            return arr.map(snap => {
                const data = snap.payload.doc.data() as Proyecto;
                const id = snap.payload.doc.id;
                return { id, ...data };
            });
        });
        return this.proyectosObservable;
    };
    

    现在您可以拨打addProyecto()

    【讨论】:

    • 我试过了,但是生成的是一个空文档,即只生成ID,没有任何内容。
    • 在您的添加功能中尝试this.afs.collection('proyectos').add(this.proyecto);
    • 我仍然生成空文档,我唯一的选择是在同一个组件中进行。
    • 我认为你应该这样做 this.afs.collection('proyectos').add(proyecto);this.proyecto 在顶部定义为空
    猜你喜欢
    • 2018-04-18
    • 2020-04-29
    • 2020-03-12
    • 2019-07-03
    • 2021-05-06
    • 1970-01-01
    • 2020-01-14
    • 2019-03-29
    相关资源
    最近更新 更多