簡體   English   中英

如何將firebase angularfire陣列分為幾周和幾天?

[英]How can I sort a firebase angularfire array into weeks and days?

我正在制作一個待辦事項列表,按周分組任務(根據已添加和完成日期),並按星期幾分組任務。 數據庫結構如下所示:

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
..

即使是概念性答案也會有所幫助。 我不知道從哪里開始。

謝謝。

另請參閱這篇文章,它提供了執行此分組的指令: 是否可以在angularfire中對.sort(compare)和.reverse數組進行排序?

你可以在這里采取一些方法。

按日期結構化的數據

如果記錄將始終由此結構提取,您可以按這種方式存儲它們;

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

然后,您可以簡單地在tasks級別將它們作為對象獲取,並且您將獲得具有嵌套在適當級別的值的預先排序的JSON對象。

這種方法與AngularFire不兼容,后者用於綁定對象或集合,而不是嵌套的數據樹,但應該謹慎使用。

使用優先權

第二種方法是在任務上添加優先級 ,這將是一個紀元時間戳。 現在,當您想要獲取它們時,您可以啟動它/結束樹中的特定點,並獲取記錄。 每個都有一個時間戳,您可以用它來識別周和日。

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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM