2017-10-09 62 views
1

使用AngularFire2我尝试从单个Firestore文档获取数据。 什么工作是使用AngularFire2我尝试从单个Firestore文档获取数据。(1)关于文档值更改

this.addressRef = afs.doc<Address>('addresses/key') 
this.addressRef.valueChanges().subscribe(val => {......} 

我想只运行一次申购代码。通常我使用take(1)来实现这一点(适用于Firebase DB)。 但这个代码

this.addressRef.valueChanges().take(1).subscribe(val => {......} 

给出错误:类型错误:this.addressRef.valueChanges(...)采取的是不是一个函数。

VS代码列出了采取行动。这是AngularFire2中的一个错误,我是这样做的错误还是有其他(更好)的方式来取消数据后停止订阅?我也尝试过,但也失败了。

回答

3

您可以通过以下步骤实现:

this.userDoc = afDs.doc<User>('users/NaGjauNy3vYOzp759xsc'); 
this.userDoc.valueChanges() 
.take(1) 
.subscribe(v => { 
    this.user = v; 
}) 

我提供了一个stackblitz你:https://stackblitz.com/edit/angular-snnbwd

只要到应用程序/ hello.component.ts看到代码。

+1

好的,起初我没有在答案中看到很多新东西,因为我已经使用相同的代码,但take()在我的设置中不起作用。但在研究你的堆栈闪电之后,我发现我的进口是不同的。我想他们是由VC自动生成的。我有“rxjs/operator/take”作为导入路径。将它更改为“rxjs/add/operator/take”,如同您的示例,现在take()工作。所以谢谢你提供完整的代码。我会进一步研究这些不同的途径。 – majodi

+0

现在每当你需要例如user.uid来编写其他代码时,你需要在订阅中这样做?这使代码看起来很奇怪并且嵌套。难道你不能从数据库中获得当前用户的uid,并且在你的组件中做了一些事情(不是html)吗? – Ruben

+0

@Ruben你还需要帮助吗?简短的回答是肯定的 - 你必须订阅。但你不需要多次调用它:) – DauleDK