使用Firebase数据的Angular JS过滤器

时间:2014-08-13 11:09:18

标签: angularjs firebase angularfire

我在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中缓存响应,但这看起来有点草率。最好的方法是什么?我对任何想法持开放态度,我不赞成使用过滤器的想法。

2 个答案:

答案 0 :(得分:0)

过滤器是我喜欢的角色之一,但是它们太重了(因为它们在每个消化周期都会被评估)并且绝对不适合你的方法,除非你使用缓存(只需要#39) ; t将其存储在$ rootScope中,改为创建缓存服务。

Firebase完全是关于性能的,在大多数情况下,规范化是你的敌人。您已经存储了用户电子邮件,为什么还要存储用户名?

更改数据结构以在聊天数据结构的网址中包含userId可能会有所帮助:Data Modeling Best Practices in Firebase/AngularFire

答案 1 :(得分:0)

最后,我通过使用angular-cache插件解决了这个问题(默认的角度缓存 - 工厂很好,但缺少一些有用的功能)。我缓存了用户,以便使用过滤器而不需要锤击firebase。