使用ngxs lab/firestore插件时如何在我的对象中获取firebase文档ID

使用ngxs lab/firestore插件时如何在我的对象中获取firebase文档ID,firebase,google-cloud-firestore,ngxs,Firebase,Google Cloud Firestore,Ngxs,我使用NGXS进行状态管理,还使用firestore-plugin() 如何在对象中添加文档的id 我已经创建了我的商店: import { Injectable } from '@angular/core'; import { NgxsFirestore } from '@ngxs-labs/firestore-plugin'; @Injectable({ providedIn: 'root', }) export class SpotsFirestore extends NgxsFir

我使用NGXS进行状态管理,还使用firestore-plugin()

如何在对象中添加文档的id

我已经创建了我的商店:

import { Injectable } from '@angular/core';
import { NgxsFirestore } from '@ngxs-labs/firestore-plugin';

@Injectable({
  providedIn: 'root',
})
export class SpotsFirestore extends NgxsFirestore<Spot> {
  protected path = 'seasons/2021/spots';
}
所以很明显,id不在我的firebase文档中,而是在识别它。但我拥有它肯定是有用的

我想我应该覆盖NgxsFirestore中的某些内容,但我不知道如何覆盖?
是否必须将其放在文档中?

您可以!您只需在服务中创建一个名为
idField
的属性,如下所示:

从'@angular/core'导入{Injectable};
从“@ngxs实验室/firestore插件”导入{NgxsFirestore};
@注射的({
providedIn:'根',
})
导出类SpotsFirestore扩展了NgxsFirestore{
保护路径='seasons/2021/spots';
idField='spotId'
}
在这种情况下,它将在属性
spotId


reference:

是id:string;是否与Firebase文档ID相同?你的模型里需要它吗?为什么你认为拥有它肯定会对你有用?因为我想要像
/spots/{id}/edit
/spots/{id}/comments
。。。那么,我在这里还会放些什么(这将允许我使用ngxs从firebase检索它)每个firebase文档都有一个名称,该名称是在创建时给出的。您可以将此名称用作id:String,该名称与集合名称一起足以检索存储的对象DocumentReference docRef=db.集合(“城市”).文档(“SF”);//异步检索文档apifourt=docRef.get();/…/响应文档snapshot document=future.get();`这是在中记录的。相关代码示例可在上找到。@George是的,我知道,但我的问题是,使用NgxsFirestore,我如何做到这一点?
import { Injectable } from '@angular/core';
import { Emitted, NgxsFirestoreConnect, StreamEmitted } from '@ngxs-labs/firestore-plugin';
import { Action, NgxsOnInit, Selector, State, StateContext } from '@ngxs/store';
import { InitializeSpotsAction } from './spots.actions';
import { SpotsFirestore } from './spots.firestore';

export interface SpotsStateModel {
  spots: Spot[];
}

@State<SpotsStateModel>({
  name: 'spots',
  defaults: {
    spots: [],
  },
})
@Injectable()
export class SpotsState implements NgxsOnInit {
  @Selector()
  static spots(state: SpotsStateModel) {
    return state.spots;
  }

  constructor(private spotsFireStore: SpotsFirestore, private ngxsFirestoreConnect: NgxsFirestoreConnect) {}
  ngxsOnInit(ctx?: StateContext<any>) {
    this.ngxsFirestoreConnect.connect(InitializeSpotsAction, {
      to: (action) => this.spotsFireStore.collection$(),
    });
  }

  @Action(StreamEmitted(InitializeSpotsAction))
  getAllEmitted(ctx: StateContext<SpotsStateModel>, { action, payload }: Emitted<InitializeSpotsAction, Spot[]>) {
    ctx.patchState({ spots: payload });
  }
}
interface Spot {
  id: string;
  name: string;
  description: string;
  checkinValue: number;
  imageUrl: string;
  coordinates: firebase.firestore.GeoPoint;
}