1

Я хотел бы иметь ng-repeat, отсортированный по значению в некоторой внешней таблице поиска.Ссылаясь на внешние переменные сферы в orderBy внутри ng-repeat

Например, предположим, что у меня есть список items с itemType за каждый товар. У меня есть отдельная таблица поиска itemTypePriorities в области, так что itemTypePriorities[someItemType] дает приоритет для данного типа элемента. Теперь я хотел бы отображать элементы в порядке их приоритетов. Я пытаюсь следующее:

<div ng-repeat="item in items | orderBy:'itemTypePriorities[item.itemType]'> 

Но это, кажется, не работает - я думаю, что это интерпретации выражения OrderBy в контексте item, т.е. он пытается сделать заказ на бессмысленные выражения item.itemTypePriorities[item.itemType].

Есть ли способ переписать нг-повтор, чтобы сделать его вками правильно, без необходимости изменения items или itemTypePriorities массивов в любом случае?

ответ

1

Вы можете использовать, конечно, фильтр orderBy, но я думаю, вам нужно будет создать пользовательскую функцию для orderit.

Например:

<div ng-repeat="item in items | orderBy : myFunction> 

Где туРипсЫоп объявлен где-то в контроллере, как:

$scope.myFunction = function(el){ 
    //el is the current element under evaluation 
} 

И должен возвращать значение, которое будет сравниваться с <, === и> с Другие. В вашем случае функция может быть:

$scope.myFunction = function(el){ 
    return itemTypePriorities.indexOf(el); 
} 

И это должно работать

+0

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

+0

Я думаю, что функциональный подход чрезвычайно эффективен, потому что вы можете оценивать так много вещей для каждого элемента, единственное, что нужно вернуть, что-то, что представляет порядок элемента. На мой взгляд, я считаю, что решение функции длиннее, возможно, более сложное, но применимо для любой ситуации, даже в самом сложном случае. – Gianmarco

+0

Предположим, вы хотите сортировать пользователей по ленте (2) по имени, (2) в тех же именах, которые вы хотите отсортировать по балансу банковского счета, и (3) если имя и баланс совпадают, сортировка по 'itemPriority' lookup как указано выше. Как бы выглядела ваша функция порядка сортировки? Я не убежден, что такая функция даже существует, особенно если баланс разрешен как произвольно большой и произвольно точный. Помните, что функция orderBy не передается 2 объектам и попросила их сравнить, но передается 1 объект и предлагается присвоить ей значение. Таким образом, функциональный подход ограничен, когда дело доходит до multifield. –

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