AngularJS orderBy не работает при использовании формата date()

OrderBy:'date' работает нормально, но, к сожалению, при добавлении или редактировании date()

<tr ng-repeat="expense in filteredlist = (expenses | filter:filterlist) | pagination: currentPage : numPerPage | orderBy:'date'">

Демо: http://codepen.io/anon/pen/VLRRpq

2 ответа

Решение

Ваша проблема в том, что старые даты сравниваются как строки, а новые даты добавляются в объекты Date.

Преобразование всех старых дат в объекты Date является одним из способов исправить это:

$scope.expenses = [/* your data */];
$scope.expenses.forEach(function(expense){ 
    expense.date = new Date(expense.date); 
});

(Codepen обновлено: http://codepen.io/anon/pen/jPJJGV)

Также работает обратное - преобразование дат в (правильно отформатированные) строки при сохранении нового расхода:

$scope.addExpense = function () {
    $scope.newexpense.date =  $scope.newexpense.date.toISOString();
    /* The rest of your creating code */
}

(Codepen обновлен, чтобы показать этот метод: http://codepen.io/anon/pen/oXVVoJ)

Выбор между указанными выше путями будет зависеть от вашей ситуации; вам нужно будет принять во внимание такие факторы, как то, как вы используете данные (то есть нужно ли вам выполнять операции с данными, подобные дате? Затем используйте первое решение), как это ожидает сервер (делает ли сервер требовать ISOStrings? Если да, то использовать второе решение) и т. д.

Но оба четко работают в обновленных решениях Codepen.

Ваша начальная дата - это isostring, тогда как отредактированная дата - это объект даты в формате javascript, который преобразуется в строку (и по некоторым причинам кавычки добавляются). Я обновил вашу ручку, добавив toIsoString() в вашей функции сохранения. См. http://codepen.io/rsids/pen/VLRRMR?editors=101

Другие вопросы по тегам