2013-10-29 28 views
22

我有一個ng-repeat元素,它將通過$http.get()結果循環。Angular JS Date過濾器不工作

<tr ng-repeat="blog in posts"> 
    <td style="text-align:center">{{ $index+1 }}</td> 
    <td>{{ blog.title }}</td> 
    <td> 
     {{ blog.author.name }} 
    </td> 
    <td> 
     {{ blog.created_at | date:'MMM-dd-yyyy' }} 
    </td> 
</tr> 

created_at在MySQL數據庫表timestamp。我正在使用angular.js v1.0.7

我從數據庫表中得到相同的輸出並且日期過濾器不工作。我該如何解決這個問題?

我的Ajax調用,

$http({method: 'GET', url: 'http://localhost/app/blogs'}). 
success(function(data, status, headers, config) { 
    $scope.posts = data.posts; 
}). 
error(function(data, status, headers, config) { 
    $scope.posts = []; 
}); 

回答

14

從服務器端,它返回created_at從laravel雄辯的字符串。

這可以使用這個JavaScript來解決,

new Date("date string here".replace(/-/g,"/")); 

因此,代碼,

$http({method: 'GET', url: 'http://localhost/app/blogs'}). 
success(function(data, status, headers, config) { 
    angular.forEach(data.posts, function(value, key){ 
    data.posts[key].created_at = new Date(data.posts[key].created_at.replace(/-/g,"/")); 
    } 
    $scope.posts = data.posts; 
}). 
error(function(data, status, headers, config) { 
    $scope.posts = []; 
}); 
+0

爲什麼沒有角度forEach – Vignesh

+1

@Vignesh是的,我應該利用這一點。 – devo

39

傳遞給需要有型的javascript日期的過濾器的日期。

你檢查了什麼值blog.created_at顯示爲沒有過濾器?

你說你的支持服務正在返回一個代表日期的字符串。您可以通過兩種方式解決此問題:

  1. 讓你的服務器端代碼返回一個JSON日期對象
    • 檢查服務器端的代碼是如何序列化,它返回
  2. 寫你自己的JSON過濾器,其接受的字符串日期和所需要的格式返回日期
    • 注意:您可以撥打角度濾波在自己的過濾

如下您可以編寫自己的過濾器:

app.filter('myDateFormat', function myDateFormat($filter){ 
    return function(text){ 
    var tempdate= new Date(text.replace(/-/g,"/")); 
    return $filter('date')(tempdate, "MMM-dd-yyyy"); 
    } 
}); 

且模板中使用這樣的:

<td> 
    {{ blog.created_at | myDateFormat }} 
</td> 

,而不是通過返回的數組循環,然後應用篩選器

+0

我已經注意到了這一點在一些答案中。但是我怎麼能在我的''http'''調用中實現這個功能?兩次我得到''2013-10-08 00:00:00'' – devo

+0

謝謝,我已經描述過我有我的日期時間戳格式,並且我希望我的代碼段有清晰的代碼。所以要轉換這個我不得不使用一些正則表達式。我發佈了最後的工作結果。 – devo

+0

+1以獲得正確的解釋。 – devo

6

您可以基於從0中獲取的數據創建,如:

$scope.date = new Date('2013', '10', '28'); // for example 

反正你可以看到這個演示中Plunker

希望它會幫助你

+0

謝謝,我已經描述過我的日期是時間戳格式。所以要轉換這個我不得不使用一些正則表達式。我發佈了最後的工作結果。 – devo

+0

+1解釋,在這裏貼出我的正確解決方案。 – devo

2

當記錄日期變量記得使用 '新',如下關鍵詞:

var time = new Date(); 

否則如果你這樣寫:

var time = Date(); 

將日期作爲函數調用,並返回一個不能用作過濾器輸入的日期時間字符串。

6

您可以添加該字符串轉換爲日期自定義過濾器,如下面的代碼:

app.filter('stringToDate',function ($filter){ 
    return function (ele,dateFormat){ 
     return $filter('date')(new Date(ele),dateFormat); 
    } 
}) 

然後使用此過濾器中的任何模板如下面的代碼:

<div ng-repeat = "a in data">{{a.created_at |stringToDate:"medium"}}</div>