Angular JS使用Firebase数据进行筛选



我在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的情况下使用过滤器

相关内容

  • 没有找到相关文章

最新更新