好吧基本上我一直在努力使用用户ID将用户详细信息存储在firebase中 .
我有一个包含对象中用户ID的项目列表 . 我希望将此用户ID传递给类似的函数
<div *ngFor="let item of items">
<p>{{getUsername(item.userId)}}</p>
</div>
在应用程序的HTML部分 .
然后使用此ID我想拉取存储在firebase中的用户名等,并将密钥作为相同的用户ID .
以下选项是我已经尝试过的东西;
Option 1 (Just a function at the same component)
输出undefined,我相信是因为函数运行并在订阅将数据传递给它之前返回username变量 .
constructor(public db: AngularFireDatabase){}
getUserName(id) {
var username;
this.db.object('users/' + id).valueChanges().subscribe(v => {
username = v['username'];
});
return username;
}
Option 2 (created a service - Injectable so it passes it to object property)
输出我需要的内容,但它显示所有列表元素的相同内容
username;
constructor(public db: AngularFireDatabase){}
getUserName(id) {
this.db.object('users/' + id).valueChanges().subscribe(v => {
this.username = v['username'];
});
return this.username;
}
所以我需要的是类似于选项1的东西,但是一旦observable获取数据并将其传递给函数内部的变量,它需要返回observable中的值,因此它不会返回未定义的值 .
2 回答
这里一个重要的概念是
Observable
是异步的,所以你可以使用常规值来获得值 . 在返回该值之前,必须等待它为emit
一个值 . 在这里阅读更多相关信息:https://gist.github.com/staltz/868e7e9bc2a7b8c1f754 .对于're trying to do specifically, I'建议只需获取
Observable
并在模板中需要时使用'async'管道 .然后在您的模板中,您可以执行以下操作:
如果您知道组件中的用户
id
,并且您想要获取该用户的用户数据并在组件代码中使用它,您可以执行以下操作:但请记住处理订阅的清理 .
尝试做这样的事情:
你不能为你的订阅返回值,你必须在订阅中完成所有操作,如果你有主数据,你必须在你的.ts中调用你的getUserName函数,然后创建包含所有信息的最终数组一旦你有了最终的数组,就可以在你的HTML中使用* ngFor循环 .
然后在您的HTML中,您可以使用* ngFor
这是一个想法,你如何解决这个问题