【问题标题】:Reading child of an automated unique ID in a nested ng-repeat在嵌套的 ng-repeat 中读取自动唯一 ID 的子项
【发布时间】:2015-12-11 17:24:25
【问题描述】:

如果 ID 不在第一级,我如何在嵌套的 ng-repeat 中获取具有自动唯一 ID 的孩子的数据?

我的 firebase 数据集的结构是这样的(注意:我不知道该数据集中用户、日期或唯一 ID 的数量或价值):

John:[

      10-12-2015: {

          "-JcFXid1A2G8EM7A_kwc": {
             "description" : "hi",
             "timestamp": "1449751857810"},

          "-JcFZP5FNtL4Yj6nja_7": {
             "description" : "this",
             "timestamp": "144975185345"},
      },

      11-12-2015: {

          "-JcFtGoZL7J-CCIjTYcL": {
             "description" : "is",
             "timestamp": "14497518513715"},

          "-JcFXid1A2G8EM7A_kwc": {
             "description" : "me",
             "timestamp": "1449751846956"},
      },

]

Thomas: [ ... ]

我的 HTML 代码是:

<ion-list>
    <ul class="list">

        <li ng-repeat="day in list">
            <ion-item class="item-divider">{{day.$id}}</ion-item>
            // That works as my output is "10-12-2015, etc"

            <li ng-repeat="key in day">
            // This does not work
                <ion-item>{{key.description}}</ion-item>
            </li>

        </li>

    </ul>
</ion-list>

我是 Firebase 和 Angular 的新手,所以如果我遗漏了一些明显的东西,我深表歉意。我也知道 Firebase 建议使用扁平层次结构,但按用户和日期对其进行排序对于我需要做的数据分析很重要。但我愿意接受建议。

仅供参考 - 我的控制器如下所示:

.controller('summaryCtrl', ['$scope','$state','$firebase','$firebaseArray','SessionData', '$ionicPopup', function($scope,$state,$firebase,$firebaseArray,SessionData,$ionicPopup){

var firebaseObj = new Firebase("https://id.firebaseio.com/" + userid);
  var fbArray = $firebaseArray(firebaseObj);

  fbArray.$loaded()
  .then(function(){
      $scope.list = fbArray;
  })
}])

谢谢。

【问题讨论】:

  • 它不起作用,因为在
  • 中,day 不是一个数组,它是一个对象。尝试在一天中做类似 ng-repeat="(key, value) 的事情">
  • @cesarandavisa 嗯,我认为由于 day 是数组 list 的一部分,它本身就是一个数组。关于如何将 day 更改为数组的任何其他想法?如果我这样实施,您的建议将不起作用。
  • 标签: angularjs ionic-framework firebase


    【解决方案1】:

    您不需要使用.$loaded()$firebaseArray 将负责在加载数据时触发$digest.$loaded() 承诺对于解析路由很有用。

    在您的情况下,尽管您需要进入 day 键来创建数组。尝试如下数据结构:

    {
      "userMessages": {
        "$uid": {
           "$message_id": { 
             "timestamp": 1450048003760 // use a timestamp
           }
         }
      }
    }
    

    通过这种方式,您可以通过/userMessages/$uid/ 获取每个用户的消息。然后使用查询,您可以按日期获取它们。

    您可以创建工厂来简化此操作。

    不要介意下面的代码结构,它使用Angular Styleguide

    angular.module('app', ['firebase'])
      .constant('FirebaseUrl', '<my-firebase-app>')
      .service('rootRef', ['FirebaseUrl', Firebase])
      .factory('messages', Messages)
      .controller('SummaryCtrl', SummaryCtrl);
    
    function Messages(rootRef, $firebaseArray) {
      return function Messages(userid, date) {
        // turn the date into a timestamp
        var timestamp = date.getTime();
        var messagesRef = rootRef.child('userMessages').child(userid);
        // query for messages on that day
        var query = messagesRef.orderByChild('timestamp').endAt(timestamp);
        return $firebaseArray(query);
      };
    }
    
    function SummaryCtrl($scope, messages, rootRef) {
      var user = rootRef.getUser()
      var today = new Date();
      $scope.messages = messages(user.uid, today);
    }
    

    【讨论】:

    • 谢谢大卫。我应该澄清一下,但我不知道 day 的数量或价值(例如“10-12-2015”)或用户和唯一 ID。关于如何解决这个问题的任何建议?
    • 你能提供更多的上下文来做你的数据结构吗?
    • 这个想法如下:每天用户可以输入一个或多个条目。有些日子用户没有输入任何条目,有些日子一,有些日子多于一。
    • 我想按日期对用户的所有消息进行分组。我认为最好的方法是将每条新消息存储到id.firebaseio.com/items{user}/{date},在那里他们可以获得唯一的上传 ID。 (到目前为止,我还没有使用过用户 ID,但我会调查一下。)我愿意接受更扁平的数据结构,但如果它们只是每条消息的属性,我不确定如何列出唯一日期。我希望这很清楚。谢谢!
    • 啊,我更新了我的答案以使用查询和新的数据结构。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签