2015-06-12 5 views
2

У меня проблема с угловым заказом. Фильтр. Я пытаюсь сортировать список предметов по дате по возрастанию или по убыванию.Angularjs orderBy фильтр не фильтрует даты правильно

Это как мой список выглядит

... 
<li ng-repeat="issue in content | myStatusFilter : selectedStatuses | orderBy : 'date' : selectedOption" class="toggle-list__row"> 
    <issue data="issue" /> 
</li> 
... 

Содержимое представляет собой массив, и каждый вопрос содержания имеет дату и эта дата сохраняется в виде строки. Когда selectedOption правда это то, что я получаю

  1. Выпуск 3 - 31.01.2015
  2. Выпуск 2 - 21.05.2015
  3. Выпуск 4 - 10.06.2015
  4. Выпуск 1 - 04.05.2014 - > должен быть первым в списке на самом деле

и когда selectedOption ложна, вывод

  1. Выпуск 1 - 04.05.2014 - должно быть последним
  2. Выпуск 4 - 10.06.2015
  3. Выпуск 2 - 21.05.2015
  4. Выпуск 3 - 31.01.2015

Не могли бы вы, пожалуйста, помогите меня и скажите, где ошибка, и как я могу исправить эту проблему.

Thx заранее

+0

вы не можете изменить формат даты в течение года, затем месяц, потом день? – sp00m

+3

Ваши фактические даты 'Date'? – scniro

+0

"по дате по восходящей и нисходящей". В то же время? Ваш вопрос непонятен. – Pureferret

ответ

4

Ваши даты являются строками, а не собственно Javascript дата объектов. Поскольку вы говорите, что не можете исправить это на сервере, вы можете по крайней мере исправить это в контроллере или в угловом сервисе.

Везде, где вы получите ваш объект, содержащий даты, цикл через объекты и превратить их в реальные сроки, как:

$http.get('something') 
    .then(function(result) { 
     result.forEach(function(item) { 
      item.date = new Date(item.date.replace(/(\d{2}).(\d{2}).(\d{4})/, "$2/$1/$3") 
     }); 
    }); 
+0

также хорошая идея, thx! – amsalk

1

Ваши даты сортируются в алфавитном порядке , либо сделать их Date объект или хранить их как «YYYY.MM.DD»

Вот example (не Н.Б. изначально написан меня, но я обновил его)

<div ng-app> 
     <div ng:controller="Main"> 
     <div ng:repeat="item in items | orderBy:'date'">{{$index}}: {{item.date | date}}</div> 
    </div> 
</div> 
function Main($scope) { 
    $scope.items = [ 
     {date: new Date('12/23/2013')}, 
     {date: new Date('12/23/2011')}, 
     {date: new Date('12/23/2010')}, 
     {date: new Date('12/23/2015')} 
    ]; 
} 

Если ваши даты приходят образуют бэкенд, вам необходимо написать в службу/завод, чтобы получить их, то вы будете иметь что-то вроде $scope.issues = IssueService.getIssues(). Который должен вернуть массив.

+0

Возможно ли изменить дату format в html-шаблоне, вы можете увидеть выше в '

  • ', где другие фильтры есть или мне нужно написать для этого настраиваемый фильтр? – amsalk

    +0

    и проблема в том, что я получаю эти значения даты из backend, и я не могу их изменить в массиве ответов. – amsalk

    +0

    @amsalk. Если у вас есть дополнительные проблемы, поиск переполнения стека может помочь: http://stackoverflow.com/a/22395280/1075247 – Pureferret

    3

    Вы можете передать функцию в свой блок по своему усмотрению. В этой функции преобразовать строку в дату:

    $scope.myDateOrderFunction = function(item) { 
        var parts = item.date.split('.'); 
        return new Date(parts[2], parts[1], parts[0]); 
    }; 
    

    , а затем вы можете вызвать его с точки зрения:

    <li ng-repeat="issue in content | myStatusFilter : selectedStatuses | orderBy : myDateOrderFunction : selectedOption" class="toggle-list__row"> 
        <issue data="issue" /> 
    </li> 
    
    +0

    Хорошая идея в разборе существующих дат! – Pureferret

    Смежные вопросы