2013-10-29 18 views
22

Ich habe ein ng-repeat Element, das durch $http.get() Ergebnis durchlaufen wird.Angular JS Datum Filter funktioniert nicht

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

Ich habe created_at als timestamp in MySQL Datenbanktabelle. Und ich verwende angular.js v1.0.7.

Ich bekomme die gleiche Ausgabe von db Tabelle und Datum Filter funktioniert nicht. Wie kann ich das lösen?

Mein Ajax-Aufruf,

$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 = []; 
}); 

Antwort

14

Von der Server-Seite wird dazu beitragen, es ist die created_at als String aus dem Laravel eloquent zurückgibt.

Dies kann mit diesem Javascript gelöst werden,

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

So ist der Code,

$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

warum nicht eckig forEach – Vignesh

+1

@Vignesh Ja, ich sollte das nutzen. – devo

39

Das auf die Filter geleitet Datum vom Typ JavaScript Date sein muss.

Haben Sie überprüft, wie der Wert blog.created_at als ohne Filter angezeigt wird?

Sie haben angegeben, dass Ihr unterstützter Dienst eine Zeichenfolge zurückgibt, die das Datum darstellt. Sie können dies auf zwei Arten lösen:

  1. Machen Sie Ihre serverseitigen Code ein JSON-Date-Objekt
    • Prüfung zurückkehren, wie der Server-Seite Code die json serialisiert, die es gibt
  2. Ihre eigenen schreiben Filter, die die Zeichenfolge Datums und gibt Datum im gewünschten Format
    • Hinweis akzeptiert: Sie können die Winkel Filter in Ihrem eigenen Filter rufen

Sie können eigene Filter schreiben wie folgt:

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

Und es so in der Vorlage verwenden:

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

Anstatt durch das zurückgegebene Array Looping und dann die Anwendung Der Filter

+0

ich dies bemerkt habe in einigen Antworten. Aber wie kann ich dies in meinem "$ http" Aufruf erreichen? Beide Male bekomme ich '' 2013-10-08 00: 00: 00'' – devo

+0

Danke, ich habe beschrieben, dass ich mein Datum im Timestamp-Format habe, und ich habe klaren Code mit meinem Schnipsel erwartet. Um dies zu konvertieren, muss ich einige Regex verwenden. Ich habe mein endgültiges Arbeitsergebnis veröffentlicht. – devo

+0

+1 für die ordnungsgemäße Erklärung. – devo

6

Sie können basierend auf abgerufenen Daten von 0 erstellen, wie:

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

Sowieso können Sie diese Demo in Plunker sehen.

Hoffe, dass es Sie

+0

Danke, ich habe beschrieben, dass ich mein Datum im Timestamp-Format habe. Um dies zu konvertieren, muss ich einige Regex verwenden. Ich habe mein endgültiges Arbeitsergebnis veröffentlicht. – devo

+0

+1 für die Erklärung, posten meine richtige Lösung hier. – devo

2

Wenn variable Stichtag erinnern 'neu' verwenden Stichwort als unten:

var time = new Date(); 

andernfalls, wenn Sie so schreiben:

var time = Date(); 

Das Datum wird als Funktion aufgerufen und es wird eine Datumszeit-Zeichenfolge zurückgegeben, die nicht als Eingabe für den Filter verwendet werden kann.

6

können Sie einen benutzerdefinierten Filter hinzufügen, die Zeichenfolge auf dem neuesten Stand zu konvertieren, wie der folgenden Code:

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

dann mit diesem Filter in einer Vorlage wie der folgenden Code:

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