Angularjs 使用Firebase数据的角度JS过滤器

Angularjs 使用Firebase数据的角度JS过滤器,angularjs,firebase,angularfire,Angularjs,Firebase,Angularfire,我在firebase中有一些数据如下所示: | | --users | --1 | --email:"hello@gmail.com" --name:"User 01" --2 | --email:"hello2@gmail.com" --name:"User 02" --chat | ---JU9ZpBj7P9dWgNYN4To | --email:"hell

我在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"
<ul class="chat" ng-repeat="message in messages  | orderByPriority | reverse">
    <li>
        <strong>{{message.user | uid2name}}</strong> {{message.content}}
    </li>
</ul>
我从firebase的一个名为“messages”的对象中获取聊天数据,我的HTML/angular如下所示:

|
|
--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"
<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中,但这似乎有点草率。最好的办法是什么?我对任何想法都持开放态度,我不赞成使用过滤器。

过滤器是我最喜欢的东西之一,但它们太重了,因为它们在每个摘要周期中都会进行评估,并且肯定不适合您的方法,除非您使用缓存,不要将其存储在$rootScope中,而是创建一个缓存服务

Firebase的核心是性能,在大多数情况下,标准化是您的敌人。您已经存储了用户电子邮件,为什么不同时存储用户名呢


更改数据结构以在聊天数据结构的URL中包含userId可能会有所帮助:

最后,我通过使用插件解决了这个问题默认的angular cache factory很好,但它缺少一些有用的功能。我缓存了用户,以便在不影响firebase的情况下使用过滤器。

如果我将用户名存储在每个聊天条目中,当用户的使用更改其名称时会发生什么情况?我希望能够用姓名更改或其他信息更新以前的聊天记录。不过,我将查看创建缓存服务。。。。谢谢:@NathanMoynihan另一种方法是改变你的数据结构,也许这个答案可以帮助你: