我在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"
我从firebase的一个名为'messages'的对象中获取聊天数据,我的HTML/angular看起来像这样:
<ul class="chat" ng-repeat="message in messages | orderByPriority | reverse">
<li>
<strong>{{message.user | uid2name}}</strong> {{message.content}}
</li>
</ul>
我要做的是抓取消息。用户,并将其从用户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中缓存响应,但这似乎有点草率。最好的办法是什么?我对任何想法都持开放态度,我不赞成使用过滤器的想法。
过滤器是我喜欢Angular的东西之一,但是它们太重了(因为它们在每个摘要循环中都要评估),并且绝对不适合你的方法,除非你使用缓存(只是不要将它存储在$rootScope中,而是创建一个缓存服务)。
Firebase完全是关于性能的,在大多数情况下,规范化是你的敌人。既然已经存储了用户邮箱,为什么不同时存储用户名呢?
改变数据结构,在你的聊天数据结构的URL中包含userId可能会有所帮助:
最后,我通过使用angular-cache插件解决了这个问题(默认的angular cache-factory很好,但它缺乏一些有用的功能)。我缓存了用户,以便在不破坏firebase的情况下使用过滤器