У меня есть приложение, в котором я показываю список элементов, каждый из которых имеет разные свойства, и одно из этих свойств используется для получения другого значения с фабрики, и я хочу иметь возможность сортировать список по этому расчетному значению.
Я знаю, что могу сохранить вычисленное значение в списке, а затем отсортировать, но это единственный способ?
Это моя скрипка и код
angular
.module("app", [])
.controller('Controller', Controller)
.factory('factory', factory)
.directive('val', val)
.controller('ValController', ValController)
DirectiveController.$inject = [ 'factory'];
function Controller() {
var vm = this;
vm.results = [{
"id": "1",
"pos": 1
}, {
"id": "2",
"pos": 2
}, {
"id": "3",
"pos": 3
}, {
"id": "4",
"pos": 4
}];
console.info(JSON.stringify(vm.results));
}
function val() {
return {
replace: true,
scope: {},
bindToController: {
id: '@'
},
controller: ValController,
controllerAs: 'vm',
template: '<td ng-bind="vm.value"></td>'
};
}
function ValController(factory) {
var vm = this;
vm.value = factory.getValue(vm.id);
}
function factory() {
var values = {
'1': 'green',
'2': 'blue',
'3': 'yellow',
'4': 'red'
};
return {
getValue: function(id) {
return values[id];
}
}
}
И простой html
<div>
<table>
<thead>
<tr>
<th>id</th>
<th>pos</th>
<th>value</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="result in vm.results | orderBy:'+value'">
<td ng-bind="result.id"></td>
<td ng-bind="result.pos"></td>
<td val id="{{result.id}}"></td>
</tr>
</tbody>
</table>
</div>
Большое спасибо!
Для этого, поскольку значение свойства само по себе не отражает вид, существует множество способов сделать это. Если вы не измените сами элементы другим свойством, вам потребуется отсортировать себя в одном месте
Пользовательский фильтр удобен, так как вы можете ввести в него завод. Поскольку фильтр используется в массиве, верните отсортированный массив на основе сопоставления значений с фабрики на элемент
.filter('valueSort',function(factory){
return function(items){
if(!items) return;
return items.sort(function(a, b){
return factory.values[a.pos] > factory.values[b.pos];
});
}
});
Посмотреть
<tr ng-repeat="result in vm.results | valueSort">
Примечание. Я настроил фабрику, чтобы вернуть ваши values
для ссылки на объекты для демонстрации