如何将firebase angularfire阵列分为几周和几天?

时间:2014-09-17 20:39:36

标签: javascript angularjs firebase angularfire

我正在处理一个待办事项列表,该列表按周分组任务(基于已添加和完成日期),并按星期几分组任务。数据库结构如下所示:

users
  userA
    tasks
      taskobject1
      taskobject2
      ..
  userB
    tasks
      taskobject1
      task object2

我使用ng-repeat向每个用户显示视图的所有任务。我希望能够先将它们分类到它们落入哪一周,然后像这样:

#week1
--monday--
task a
task b
--tuesday--
task c
task d
..
#week2
--monday--
task a
..

即使是概念性答案也会有所帮助。我不知道从哪里开始。

感谢。

1 个答案:

答案 0 :(得分:4)

另见本文,其中提供了执行此分组的指令:Is it possible to .sort(compare) and .reverse an array in angularfire?

您可以采取一些方法。

按日期结构化的数据

如果这个结构总是提取记录,你可以这样存储它们;

/users/usera/tasks/week1/monday/taska/...

然后你可以简单地在tasks级别获取它们作为一个对象,你将获得一个预先排序的JSON对象,其值嵌套在适当的级别。

这种方法与AngularFire不兼容,AngularFire用于绑定对象或集合,而不是嵌套的数据树,但应该小心使用。

使用优先级

第二种方法是add priorities到任务,这将是一个纪元时间戳。现在,当您想要获取它们时,您可以启动它/结束树中的特定点,并获取记录。每个都有一个时间戳,您可以使用它来识别周和日。

var ref = new Firebase(ref).startAt(twoWeeksAgo).endAt(nextThursday);
$scope.list = $fireabse(ref).$asArray();

但是,这不会对条目进行细分。您需要检查ng-repeat中的每个条目并动态添加标题:

// in the controller
var last = null;
$scope.priorityChanged(priority) {
   /** 
    * here we would use a library like moment.js to parse the priority as a date
    * and then do a comparison to see if two elements are for the same day, such as 
    **/
   var current = moment(priority).startOf('day');
   var changed = last === null || !last.isSame(current);
   last = current;
   return changed;
};

$scope.getDayName = function($priority) {
   return moment($priority).format('dddd');
};

<!-- in the view -->
<li ng-repeat="item in list" ng-init="changed = priorityChanged(item.$priority)">
   <h3 ng-show="changed">{{getDayName(item.$priority)}}</h3>
   {{item|json}}
</li>

这种方法很容易与AngularFire兼容。

滚动自己的列表

最后一种方法是削减AngularFire并推出自己的。例如,如果我们在每个任务中存储了工作日和工作日,我们可以执行以下操作:

app.service('DatedList', function($timeout) {
   return function(pathToList) {
      var list = {};

      pathToList.on('child_added', function(snap) {
         $timeout(function() { // force Angular to run $digest when changes occur
            var data = snap.val();
            var week_number = data.week;
            var week_day = data.day;
            list[week_number][week_day] = data;
         });
      });

      //todo: write similar processing for child_changed and child_removed

      return list;
   }
});

app.controller('ctrl', function($scope, DatedList) {
   var listRef = new Firebase(URL).limit(500);
   $scope.weeks = DatedList(listRef);
});

<div controller="ctrl">
  <div ng-repeat="(week, days) in weeks">    
     <h1>{{week}}</h1>
     <div ng-repeat="(day, items) in days">
        <h2>{{day}}</h2>
        <div ng-repeat="item in items">
           {{item|json}}
        </div>
     </div>
  </div>
</div>