2017-01-03 5 views
0

I UI-grid verwenden, und ich habe eine Reihe von JS Datum Objekten wie so:Angular UI-grid Sortierung nicht nach Datum

"dob": new Date('1942-11-19') 

Ich mag die Spalte nach Datum filtern können, wenn Sie Klicken Sie auf die Schaltflächen "aufsteigend/absteigend sortieren". Als solche habe ich die colDef up wie so gesetzt:

 { 
     field: 'dob' 
     , displayName: 'D.O.B.' 
     , width: '130' 
     , editableCellTemplate: '<div><form name="inputForm"><input type="INPUT_TYPE" ng-class="\'colt\' + col.uid" ui-grid-editor ng-model="MODEL_COL_FIELD" style="border-bottom-color: #74B3CE; border-bottom-width: 2px;"></form></div>' 
     , headerCellClass: $scope.highlightFilteredHeader 
     , cellTemplate: '<div class="ui-grid-cell-contents" >{{grid.getCellValue(row, col)| date:\'MM-dd-yyyy\'}}</div>' 
     , cellFilter: 'date' 
     , type: 'date' 
     }, 

jedoch die Spalte einfach nicht richtig sortiert. Ich habe sogar versucht, eine Funktion zum Einrichten es von einer externen Taste sortieren, wie so:

 function mostRecent(){ 
     console.log('clicked mostRecent'); 
     $scope.gridApi.grid.sortColumn(
      $scope.gridApi.grid.getColumn('dob'), uiGridConstants.DESC 
     ); 
     $scope.gridApi.grid.notifyDataChange(uiGridConstants.dataChange.ALL); //this line updates the rest of the columns accordingly 
     }; 

Aber es verursacht auch einen mish-Brei Art, die nicht korrekt ist. Weiß jemand, was das Problem ist? Ich dachte, es könnte mit meinem cellTemplate zu tun haben, aber nach dem Entfernen der Vorlage gab es keinen Unterschied ...

Antwort

2

Ja, Sie haben Recht, ui-Grid unterstützt keine Sortierung von Datum Spalten.

Sie können jedoch eine sortingAlgorithm in der columnDef definieren.

Hier ist, wie Sie Ihre Spaltendefinition sollte folgendermaßen aussehen:

... 

columnDefinition.sortingAlgorithm = function (firstDateString, secondDateString) { 
    var dateFormat = 'YYYY-MM-DD'; 
    return function (firstDateString, secondDateString, dateFormat) { 
    if (!firstDateString && !secondDateString) { 
     return 0; 
    } 

    if (!firstDateString) { 
     return 1; 
    } 

    if (!secondDateString) { 
     return -1; 
    } 

    var firstDate = $window.moment(firstDateString, dateFormat); 
    if (!firstDate.isValid()) { 
     throw new Error('Invalid date: ', firstDateString); 
    } 

    var secondDate = $window.moment(secondDateString, dateFormat); 
    if (!firstDate.isValid()) { 
     throw new Error('Invalid date: ', secondDateString); 
     } 

    if (firstDate.isSame(secondDate)) { 
     return 0; 
    } else { 
     return firstDate.isBefore(secondDate) ? -1 : 1; 
    } 
    }; 
}; 

... 

Sie bitte, dass in diesem Beispiel beachten Moment.js verwendet wird. Es ist eine sehr nützliche Bibliothek, so dass Sie möglicherweise auch einen anderen Ort in Ihrem Projekt finden, wo Sie es verwenden können.

+0

Danke für die Info. Ich habe es versucht, es scheint leider keinen Einfluss auf die Sorte zu haben. Ich bekomme immer noch die gleichen, unsortierten Ergebnisse – IWI

+0

@IWI können Sie Plunker oder JSFiddle erstellen? – tomepejo

+1

Sie hatten eigentlich recht. Ich bin ein Narr und habe gerade gemerkt, dass meine Daten Strings und keine Datumsobjekte waren .... – IWI

Verwandte Themen