【问题标题】:Return document/collection as object using AngularFireStore使用 AngularFireStore 将文档/集合作为对象返回
【发布时间】:2021-04-24 02:34:23
【问题描述】:

我正在编辑问题以使其更清楚:

使用此代码将返回一个 Promise,在某些情况下非常有用。服务.ts:

async getElement(id: string): Promise<AngularFirestoreDocument<Element>> {
   return this.firestore.doc<Element>(`/element/${id}`);
}

我正在寻找一种将其作为对象返回的方法,以便它不再与 firebase 链接。

这是我的page.ts

async ngOnInit() {
   this.elementId = this.route.snapshot.paramMap.get('id');
   this.elementService.getElement(this.elementId).then(element$ => {
      this.element= element$.valueChanges();
   });
}

关于如何做的任何想法?

我希望能够进行(离线)操作,例如

this.element.name = 'New name';

{{element.name}}

我对收藏也有同样的问题。

【问题讨论】:

    标签: angular firebase google-cloud-firestore angularfire


    【解决方案1】:

    如果我理解正确,您想要获取文档,断开与 firebase 的连接并将其用作简单的 javascript 对象。在这种情况下,您的文档获取流程应如下所示:

    this.firestore.doc('path/to/doc').get().toPromise().then(res => {
      this.doc = res.data();
    });
    

    对于集合,实现非常相似

    this.firestore.collection('/path/to/collection').get().toPromise().then(res => {
      this.collection = res.docs.map(d => d.data());
    });
    

    在这种情况下,您将获得一个简单的 JavaScript 对象,如 this.docthis.collection 中的数组,您可以随意使用它们。但是,您的任何更改都不会直接影响云中的 Firebase 实体。您需要为此创建单独的方法。

    如果我理解正确并且我的回答对您有帮助或者您还有一些问题,请告诉我。

    【讨论】:

    • @Max,你有机会检查我的答案吗?它对你有用还是需要一些额外的信息?
    • 您好,很抱歉耽搁了,我很抱歉。是的,这是正确的方法。我使用这种方式将文档数据存储到我的服务中。不幸的是,我也在寻找一种在我的页面中使用这些数据的方法。例如如何使用“this.docservice.doc”作为一个有角度的东西,比如 {{ doc.name }}。也许我需要订阅它,我真的不知道。你有答案吗?原谅我的英语不好,谢谢。
    • 您可以通过 public 访问修饰符将您的服务注入到组件中,然后直接在 HTML 中呈现来自服务的对象,即 {{ myService.doc }}
    【解决方案2】:

    valueChanges 返回且可观察,因此您需要使用 async 管道渲染它

    {{ (element | async)?.name }}
    

    如果要在本地更新,需要订阅

    this.firestore.doc(`/element/${id}`).valueChanges()
    .pipe(
      take(1)
    )
    .subscribe(doc => {
      this.element = doc;
    });
    

    【讨论】:

      【解决方案3】:

      您似乎在使用AngularFire

      开启document.service.ts

      constructor(private firestore: AngularFirestore) { }
      
      addDocument(document: DocumentInterface): Observable<any> {
        this.documentCollection = this.firestore.collection(`documents/`);
        return from(this.documentCollection.add(document));
      }
      

      要使用它,只需注入 documentService 服务。

      constructor(private documentService: DocumentService) {
      }
      
      createDocument(document: DocumentInterface) {
        this.documentService.addDocument(document).subscribe(() => console.log('Success'), () => console.log('error'))
      }
      

      More info on docs

      【讨论】:

      • 嘿,感谢您的帮助,我尝试了您的代码,但无法使其工作。我编辑了这个问题,所以它更清楚。谢谢。
      最近更新 更多