Spec-Zone.ru › Angular.js 1.5

Улучшить эту документацию Просмотреть исходный код 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)

Аргументы

Параметр Тип Подробности
коллекция ArrayArrayLike

Коллекция (массив или похожий на массив объект) для сортировки.

выражение
(необязательно)
function()stringArray.<(function()|string)>

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

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

  • Function: функция-экстрактор. Эта функция будет вызываться с каждым элементом в качестве аргумента, а возвращаемое значение будет использовано для сортировки.
  • string: выражение Angular. Это выражение будет вычислено для каждого элемента, и результат будет использован для сортировки. Например, используйте '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–2017 Google, Inc.
Licensed under the Creative Commons Attribution License 4.0.
https://code.angularjs.org/1.5.11/docs/api/ng/filter/orderBy

Spec-Zone.ru

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