2014-07-08 63 views
0

我正在創建類似於「Whatsapp」的簡單消息列表。我想包括小Blurb的說:今天,昨天等AngularJS:根據時間戳添加元素

JSON格式:

{ 
     "id":"2", 
     "chat_id":"2", 
     "msg":"sample message 1", 
     "timestamp":1404803173 
    } 

HTML:

<ul> 
    <li class="time"><span>Today/Yesterday/2DaysAgo</span></li> 
    <li ng-repeat="result in results">{{result.msg}}<small>{{result.timestamp*1000 | date:'medium'}}</small></li> 
</ul> 

我想說明的第一<li>class="time")只有一次一天(並非針對所有消息)。有沒有更好的辦法可以做到這一點?

回答

1

你有服務器端嗎?如果是,要做到這一點的最好辦法是:

  1. 顯示在第一次加載了「時間」裏每一個新的一天。
  2. 一旦li被加載,在服務器端將標誌設置爲「true」
  3. 在每天晚上0000小時(或每天早上首次加載)將標誌設置爲false。
  4. 如果當天已經將標誌設置爲true,則檢查每個負載。

不確定這是否可以純粹從客戶端完成。有一種方法值得一個節目將是設置在LocalStorage每天一次的標誌(追加日期也許?),並檢查這個標誌在每次加載..

1

恕我直言,最好的辦法是按時間排序消息,然後到白天和輸出重複天,消息在天將它們分割,與其他方法那可真的是過於複雜,不值得花時間

0

考慮到這JSON是從服務來了,它是一個數組:

var json=[ 
    { 
       "id":"1", 
       "chat_id":"2", 
       "msg":"sample message 1", 
       "timestamp":1404803173 
    }, 
    { 
       "id":"2", 
       "chat_id":"2", 
       "msg":"sample message 2", 
       "timestamp":1404803174 
    }, 
...] 

然後你可以在你的控制器上創建一個新的對象循環遍歷JSON中的項目並添加一個唯一的鍵值E對於所有的日子,所以你可以過濾它如:日期不帶「/」

$scope.json = Service.json; 

$scope.dates = []; 
$scope.messages = []; 
for(i=0; i<$scope.json.length; i++){ 
    var d = new Date($scope.json[i].timestamp*1000); 
    var index = String(d.getDate()) + String((d.getMonth()+1)) + String(d.getFullYear()); 
    var obj = {id: index, data: $scope.json[i]}; 
    $scope.messages.push(obj); 
    if($scope.dates.indexOf(index) == -1) $scope.dates.push(index); 
} 

然後,在你的看法:

<ul ng-repeat="date in dates"> 
    <li class="time"><span>{{date | someFilterToGetDayFromDate}}</span></li> 
    <li ng-repeat="message in messages | filter:{'id': date}:true">{{message.msg}}<small>{{message.timestamp*1000 | date:'medium'}}</small></li> 
</ul> 

我沒有測試的代碼,但希望你會得到在這裏做什麼的想法。 如果不清楚,請告訴我,我會試着進一步解釋。