Spec-Zone.ru › Angular.js 1.6

Улучшить документацию Просмотреть исходный код orderBy

  1. Фильтр в модуле ng

Обзор

Возвращает массив, содержащий элементы из указанного collection, отсортированные по comparator функции на основе значений, вычисленных с помощью expression предиката.

Например, [{id: 'foo'}, {id: 'bar'}] | orderBy:'id' приведет к [{id: 'bar'}, {id: 'foo'}].

collection может быть массивом или массивоподобным объектом (например, NodeList, объект jQuery, TypedArray, строка и т. д.).

expression может быть одним предикатом или списком предикатов, каждый из которых служит разрывом для предыдущего. expression оценивается для каждого элемента, а вывод используется для сравнения с другими элементами.

Вы можете изменить порядок сортировки, установив reverse в true. По умолчанию элементы сортируются по возрастанию.

Сравнение выполняется с помощью функции comparator. Если она не указана, используется по умолчанию встроенный компаратор (подробности см. ниже — вкратце, он сравнивает числа численно, а строки по алфавиту).

Внутри

Сортировка указанного collection происходит в два этапа:

  1. Все элементы передаются через предикат (или предикаты), и возвращаемые значения сохраняются вместе с их типом (string, number и т. д.). Например, элемент {label: 'foo'}, прошедший через предикат, извлекающий значение свойства label, будет преобразован в:
    {
      value: 'foo',
      type: 'string',
      index: ...
    }
    
  2. Функция компаратора используется для сортировки элементов на основе полученных значений, типов и индексов.

Если вы используете пользовательский компаратор, он будет вызываться с парами объектов вида {value: ..., type: '...', index: ...} и должен возвращать 0, если объекты равны (с точки зрения компаратора), -1, если первый объект должен иметь более высокую позицию, чем второй, или 1 в противном случае.

Чтобы гарантировать детерминированную сортировку на всех платформах, если ни один из указанных предикатов не может отличить два элемента, orderBy автоматически введет дополнительный предикат, который возвращает индекс элемента в качестве value. (Если вы используете пользовательский компаратор, убедитесь, что он также может обрабатывать этот предикат.)

Если пользовательский компаратор по-прежнему не может отличить два элемента, они будут отсортированы по своему индексу с использованием встроенного компаратора.

Наконец, чтобы упростить вещи, если предикат возвращает объект в качестве извлечённого значения для элемента, orderBy попытается преобразовать этот объект в примитивное значение перед передачей его компаратору. Следующие правила управляют преобразованием:

  1. Если объект имеет метод valueOf(), который возвращает примитив, его возвращаемое значение будет использоваться вместо него.
    (Если объект имеет метод valueOf(), который возвращает другой объект, то возвращаемый объект будет использоваться на последующих шагах.)
  2. Если у объекта есть пользовательский метод toString() (т. е. не унаследованный от Object), который возвращает примитив, его возвращаемое значение будет использоваться вместо него.
    (Если объект имеет метод toString(), который возвращает другой объект, то возвращаемый объект будет использоваться на последующих шагах.)
  3. Преобразование не выполняется; используется сам объект.

Встроенный компаратор по умолчанию

Встроенный компаратор по умолчанию должен подойти для большинства случаев использования. Короче говоря, он сравнивает числа численно, строки алфавитно (и регистронезависимо), для объектов использует их индекс в исходном наборе, и сортирует значения разных типов по типу.

Более конкретно, он выполняет следующие действия для определения относительного порядка элементов:

  1. Если сравниваемые значения имеют разные типы, сравните типы сами по алфавиту.
  2. Если оба значения имеют тип string, сравните их алфавитно, не учитывая регистр и локаль.
  3. Если оба значения являются объектами, сравните их индексы.
  4. В противном случае верните:
    • 0, если значения равны (по точному сравнению, т. е. используя ===).
    • -1, если первое значение "меньше", чем второе значение (сравнение выполняется с помощью оператора <).
    • 1, в противном случае.

Примечание: Если вы заметили, что числа не сортируются так, как ожидается, убедитесь, что они фактически сохраняются как числа, а не строки. Примечание: Для целей сортировки значения null обрабатываются как строка 'null' (т. е. type: 'string', value: 'null'). Это может привести к неожиданному порядку сортировки по сравнению с другими значениями.

Использование

В привязке шаблонов HTML

{{ orderBy_expression | orderBy : expression : reverse : comparator}}

В JavaScript

$filter('orderBy')(collection, expression, reverse, comparator)

Аргументы

Параметр Тип Подробности
collection ArrayArrayLike

Массив или массивоподобный объект для сортировки.

expression
(необязательно)
function()stringArray.<(function()|string)>

Предикат (или список предикатов), который используется компаратором для определения порядка элементов.

Может быть одним из:

  • Function: функция-получатель. Эта функция вызывается с каждым элементом в качестве аргумента, и возвращаемое значение используется для сортировки.
  • string: выражение AngularJS. Это выражение оценивается для каждого элемента, а результат используется для сортировки. Например, используйте 'label' для сортировки по свойству label или 'label.substring(0, 3)' для сортировки по первым 3 символам свойства label.
    (Результат константного выражения интерпретируется как имя свойства, которое будет использоваться для сравнения. Например, используйте '"special name"' (обратите внимание на дополнительные двойные кавычки) для сортировки по свойству special name)
    Выражение может быть необязательно префиксами + или - для управления направлением сортировки, возрастания или убывания. Например, '+label' или '-label'. Если свойство не указано (например, '+' или '-' ), в сравнениях используется сам элемент коллекции.
  • Array: массив из функций и/или строковых предикатов. Если предикат не может определить относительный порядок двух элементов, используется следующий предикат в качестве разделителя.

Примечание: Если предикат отсутствует или пуст, он по умолчанию устанавливается в '+'.

reverse
(необязательно)
boolean

Если true, изменить порядок сортировки на обратный.

comparator
(необязательно)
function()

Функция компаратора, используемая для определения относительного порядка пар значений. Если опущена, будет использоваться встроенный компаратор.

Возвращает

Array
  • Отсортированный массив.

Примеры

Сортировка таблицы с помощью ngRepeat

Ниже приведен пример простого ngRepeat, где данные отсортированы по возрасту в порядке убывания (выражение установлено в '-age'). Параметр comparator не установлен, поэтому используется встроенный компаратор по умолчанию.

Динамическое изменение параметров

Все параметры могут быть изменены динамически. Следующий пример показывает, как сделать столбцы таблицы сортируемыми, связав параметры expression и reverse со свойствами области видимости.

Использование orderBy внутри контроллера

Также возможно вызывать фильтр orderBy вручную, введя orderByFilter, и вызвав его с желаемыми параметрами. (В качестве альтернативы, можно ввести фабрику $filter и получить фильтр orderBy с помощью $filter('orderBy').)

Использование пользовательского компаратора

Если у вас есть очень специфические требования к тому, как сортируются элементы, вы можете передать свою собственную функцию компаратора. Например, вам может потребоваться сравнить некоторые строки с учетом локали. (При указании пользовательского компаратора также необходимо передать значение для аргумента reverse — передача false сохраняет порядок сортировки по умолчанию, т. е. по возрастанию).

© 2010–2018 Google, Inc.
Licensed under the Creative Commons Attribution License 4.0.
https://code.angularjs.org/1.6.9/docs/api/ng/filter/orderBy

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API