У меня есть список параметров, и у каждого параметра может быть выбрано несколько тегов из общего массива тегов.
В приведенном ниже примере это упорядочивает теги каждой строки Option по одному списку «выбранных тегов», в этом случае теги выбираются в первой строке.
Мне нужно изменить его так, чтобы список тегов каждой строки параметров был упорядочен по выбранным тегам.
Кажется, что это довольно просто сделать, просто нужно использовать текущие "опции [?]. Выбранные" в функции упорядочения, но я не могу найти способ сделать эту простую задачу ...
searchTags = "";
options = [
{ "Name": "optA", "Selected": [3]},
{ "Name": "optB", "Selected": [2]},
{ "Name": "optC", "Selected": [1,3] }
];
mytags = [
{ "Id": 1, "Name": "tag-a1"},
{ "Id": 2, "Name": "tag-b2"},
{ "Id": 3, "Name": "tag-c3" }
];
tagFieldOrder = function (tag) {
var tagList = $scope.options[0].Selected
if (tagList && tagList.includes(tag.Id))
return 'a' + tag.Name + '';
else
return 'z' + tag.Name + '';
};
<md-list-item ng-repeat="opt in options">
<div style="margin-right:20px;">
{{opt.Name}}
</div>
<div style="margin-right:20px;">
<md-select ng-model="opt.Selected" multiple class="inline-flex md-select-down" >
<md-select-header class="search-header">
<input type="search"
ng-model="searchTags"
placeholder="Filter Tags"
class="md-text" />
</md-select-header>
<md-option ng-repeat="tag in mytags | orderBy:tagFieldOrder | filter:searchTags" value="{{tag.Id}}">
{{tag.Name}}
</md-option>
</md-select>
</div>
</md-list-item>
https://plnkr.co/edit/HYtRCaNBZb5KTpPNIfZ6?p=preview
Я думал об использовании $ index, но не смог заставить его работать, либо я мог получить текущий объект "tag" ИЛИ $ index, связанный с итератором параметров, а не оба. $ parent. $ index возвращает всегда так же, как $ index.
Я не могу изменить параметры или структуру тегов, так как они используются другими частями системы, а также есть куча других данных в этих структурах в моем реальном проекте.
Ожидаемым результатом будет то, что во втором ряду «tag-b2» должен появиться сверху.
<md-option ng-repeat="tag in mytags | orderBy:tagFieldOrder(tag, opt.Selected)>
$scope.tagFieldOrder = function (tag, tagList) { ... }
«тег» в этом случае не определен
<md-option ng-repeat="tag in mytags | orderBy:tagFieldOrder($index, $parent.$index)">
$scope.tagFieldOrder2 = function (index1, index2) { ... }
Невозможно получить текущий индекс, только родительский.
Я думал о двух <md-option ...>
, с фильтрами для выбранных и другим для невыбранных. Но проблема в том, что я не знаю, какой тег или какую опцию я фильтрую ...
Единственный способ найти список тегов, упорядоченный по выбранным тегам, - использовать ng-if="isSelected(tag, opt.Selected)"
вместо любого реального порядка. Но это некрасиво и имеет некоторые проблемы ...
Обновлен Plunker, чтобы показать, что это «решение» вроде работает.
Но я думаю, что никто не мог добиться большего успеха, поскольку никто здесь не предлагал никакой помощи вообще.