向 Firebase Cloud Firestore 和 Angular 添加数据

Posted

技术标签:

【中文标题】向 Firebase Cloud Firestore 和 Angular 添加数据【英文标题】:Adding Data to Firebase Cloud Firestore and Angular 【发布时间】:2018-04-17 01:53:43 【问题描述】:

首先我必须说我正在学习 Angular。也许答案太明显了,但我看不到。我在网上搜索过类似问题的回复,但没有找到适合我的答案。

我制作了一个 Angular 模板驱动表单来将产品存储在我的 Firebase Cloud Firestore 数据库中。我创建了一个名为“Product”的模型

product.ts

export class Product 
constructor(
    public code: string,
    public desc: string,
    public stock: number,
    public price: number,
    public off: number,
    public details?: string
) 

然后,我有 product.component.ts

import  Component  from '@angular/core';
import  Product  from './product';
import  AngularFirestore, AngularFirestoreCollection  from 'angularfire2/firestore';
import  Observable  from 'rxjs/Observable';


@Component(
    selector: 'app-admin-product',
    templateUrl: 'product.component.html'
)

export class AdminProductComponent 

model = new Product('', '', 0, 0, 0);
successMsg = 'Data successfully saved.';

productsRef: AngularFirestoreCollection<Product>;
product: Observable<Product[]>;

constructor(private afs: AngularFirestore) 
    this.productsRef = this.afs.collection<Product>('productos');


save() 
    this.productsRef.add(this.model).then( _ => alert(this.successMsg));

TypeScript 根本不返回错误,一切似乎都正常。但是当我运行我的应用程序并尝试保存表单的数据时,控制台返回下一个错误:

AdminProductComponent.html:51 ERROR 错误:函数 CollectionReference.add() 要求其第一个参数是对象类型,但它是:自定义产品对象

我解决了将自定义对象传递给这样的简单对象的问题:

const product = 
    code: this.model.code,
    desc: this.model.desc,
    stock: this.model.stock,
    price: this.model.price,
    off: this.model.off,
    details: this.model.details

并像这样保存数据:

save() 
    this.productsRef.add(product).then( _ => alert(this.successMsg)); 

但我认为这不是正确的解决方案,可能会导致将来调用应用程序时出现问题。

【问题讨论】:

【参考方案1】:

我使用了 typescript 扩展运算符

  add(wizard: Wizard): Promise<DocumentReference> 
    return this.wizardCollection.add(...wizard);
  

【讨论】:

【参考方案2】:

你可以试试这个方法,希望你用的是最新的打字稿

product.ts

export interface Product 
   code: string;
   desc: string;
   stock: number;
   price: number;
   off: number;
   details?: string

在您的 product.component.ts

export class AdminProductComponent 

model:Product;
successMsg = 'Data successfully saved.';

productsRef: AngularFirestoreCollection<Product>;
product: Observable<Product[]>;

constructor(private afs: AngularFirestore) 
    this.productsRef = this.afs.collection<Product>('productos');

    this.model = 
      code:'',
      desc:'',
      stock:0,
      price:0,
      off:0
    


save() 
    this.productsRef.add(this.model).then( _ => alert(this.successMsg));

我认为通过这样做model = new Product('', '', 0, 0, 0); 你会得到一个类的实例而不是对象。

【讨论】:

谢谢@Hareesh!我刚刚删除了每个 Product 接口索引的“公共”,并用逗号而不是分号分隔并且工作正常!【参考方案3】:

我用过

save() 
    const param = JSON.parse(JSON.stringify(this.model));
    this.productsRef.add(param).then( _ => alert(this.successMsg));
 

【讨论】:

这对我也有用..不知道为什么要对对象进行字符串化.. :( 使用 JSON.stringify 将自定义对象转换为字符串。 JSON.parse 解析 JSON 并返回一个对象。由于 JSON 没有(也不能)有任何类型信息,因此返回一个普通对象。 这是个坏主意,因为它会破坏过程中的任何时间戳或 GeoPoints【参考方案4】:

以下代码在您的 Product.component.ts 文件中对我有用

export class AdminProductComponent 

model:Product;
successMsg = 'Data successfully saved.';

productsRef: AngularFirestoreCollection<Product>;
product: Observable<Product[]>;

constructor(private afs: AngularFirestore) 
    this.productsRef = this.afs.collection<Product>('productos');


save() 
    const productData =;
       
      productData['code']:'123',
      productData['desc']:'yes',
      productData['stock']:500,
      productData['price']:10000,
      productData['off']:10
  
    this.productsRef.add(productData).then( _ => alert(this.successMsg));

【讨论】:

【参考方案5】:

您还可以在 Product 类中创建一个深拷贝方法,但这不太优雅。

export class Product 
  constructor(
    public code: string,
    public desc: string,
    public stock: number,
    public price: number,
    public off: number,
    public details?: string
  ) 

  public getData(): object 
    const result = ;
    Object.keys(this).map((key) => (result[key] = this[key]));
    return result;
  

然后将其用作:

this.productsRef.add(product.getData()).then( _ => alert(this.successMsg)); 

【讨论】:

以上是关于向 Firebase Cloud Firestore 和 Angular 添加数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Firebase Cloud Messaging 向所有用户发送数据负载?

按用户属性向用户发送 Firebase Cloud Messaging 通知

通过NodeJS向Firebase Cloud Messaging发送消息

向 Firebase Cloud Firestore 和 Angular 添加数据

无法向 Firebase Cloud Messaging 发送 iOS CriticalAlert

如何检测真正的 iOS/APNS 推送令牌何时向 Firebase Cloud Messaging (FCM) 注册?