我在firebase中有一些看起来像这样的数据:
|
|
--users
|
--1
|
--email:"hello@gmail.com"
--name:"User 01"
--2
|
--email:"hello2@gmail.com"
--name:"User 02"
--chat
|
---JU9ZpBj7P9dWgNYN4To
|
--email:"hello@gmail.com"
--content:"Hi, i'm user 01! How are you?"
--user:"1"
--timestamp:"123456789"
---JX8ZpBnli7hliwehlfi
|
--email:"hello2@gmail.com"
--content:"Hi, i'm user 02! I'm great thanks!"
--user:"2"
--timestamp:"123456789"
我从名为'messages'的对象中获取firebase中的聊天数据,我的HTML / angular看起来像这样:
<ul class="chat" ng-repeat="message in messages | orderByPriority | reverse">
<li>
<strong>{{message.user | uid2name}}</strong> {{message.content}}
</li>
</ul>
所以我想要做的就是抓住message.user并将其从用户ID转换为名称。我认为一个好方法是使用过滤器:
.filter('uid2name', function(loginService, $rootScope) {
// Takes a userid and outputs a users name
return function(input) {
var ref = new Firebase('https://<myapp>.firebaseio.com/users/' + input);
return $firebase(ref).name;
};
})
现在这个工作正常,但它通过基本上每秒多次轮询firebase来实现 - 而不是我想要做的事情。我曾考虑在$ rootScope中缓存响应,但这看起来有点草率。最好的方法是什么?我对任何想法持开放态度,我不赞成使用过滤器的想法。
答案 0 :(得分:0)
过滤器是我喜欢的角色之一,但是它们太重了(因为它们在每个消化周期都会被评估)并且绝对不适合你的方法,除非你使用缓存(只需要#39) ; t将其存储在$ rootScope中,改为创建缓存服务。
Firebase完全是关于性能的,在大多数情况下,规范化是你的敌人。您已经存储了用户电子邮件,为什么还要存储用户名?
更改数据结构以在聊天数据结构的网址中包含userId可能会有所帮助:Data Modeling Best Practices in Firebase/AngularFire
答案 1 :(得分:0)
最后,我通过使用angular-cache插件解决了这个问题(默认的角度缓存 - 工厂很好,但缺少一些有用的功能)。我缓存了用户,以便使用过滤器而不需要锤击firebase。