#javascript #angularjs #ngtable
#javascript #angularjs #ngtable
Вопрос:
- что я пытаюсь сделать
Я пытаюсь заставить один из моих столбцов принимать два числа (в одном столбце), чтобы я мог фильтровать числовые данные по диапазону только для этого столбца. Вся остальная сортировка, разбивка на страницы и фильтрация по «содержать текст» работают нормально, но я просто не уверен, как мне сделать только один конкретный столбец с фильтром «диапазон».
-
графическое представление того, что я хочу
column_header1 columns_header2 column_header3 contain_filter1 contain_filter2 filter3_min_number filter3_max_number data data numeric data . . . . . . . . .
-
Что у меня есть до сих пор
Я нашел один пример с веб-сайта модуля ng-table и попытался внедрить их код в свой, но я не знаю, как подойти к нему, когда мне нужно реализовать функцию range внутри моего getData. Пример, который я нашел http://codepen.io/christianacca/pen/yNWeOP Пользовательский алгоритм фильтрации «возрастных» данных был тем, на что я смотрел.
-
мой app.js
$http.get("http://hostname:port/variant/whole/1-10000", {cache: true}) .then(function (response) { $scope.variants = response.data; $scope.data = $scope.variants; var self = this; self.variantFilterDef = { start: { id: 'number', placeholder: 'Start' }, end: { id: 'number', placeholder: 'End' } }; self.variantsTable = new NgTableParams({ page:1, count: 10 }, { filterOptions: { filterFn: variantRangeFilter }, dataset: $scope.data, filterLayout: "horizontal" }); function variantRangeFilter(data, filterValues/*, comparator*/){ return data.filter(function(item){ var start = filterValues.start == null ? Number.MIN_VALUE : filterValues.start; var end = filterValues.end == null ? Number.MAX_VALUE : filterValues.end; return start <= item.pos amp;amp; end >= item.pos; }); } /* from this part on, it is working code but no 'Range' function $scope.variantsTable = new NgTableParams({ page: 1, count: 10 }, { total: $scope.variants.length, getData: function (params) { if (params.sorting()) { $scope.data = $filter('orderBy')($scope.variants, params.orderBy()); } else { $scope.data = $scope.variants; } if (params.filter()) { $scope.data = $filter('filter')($scope.data, params.filter()); } else { $scope.data = $scope.data; } $scope.data = $scope.data.slice((params.page() - 1) * params.count(), params.page() * params.count()); return $scope.data; } }); */ }); });
-
мой variant.html
<table ng-table="variantsTable" show-filter="true" class="table table-bordered table-striped table-condensed"> <tr ng-repeat="variant in $data"> <td data-title="'chrom'" sortable="'chrom'" filter="{ 'chrom': 'text' }" > {{variant.chrom}} </td> <td data-title="'id'" sortable="'id'" filter="{ 'id': 'text' }" > {{variant.id}} </td> <td data-title="'pos'" sortable = "'pos'" filter = "{ 'pos': 'text' }"> {{variant.pos}} </td>
-
Я был бы очень признателен за любое предложение или любой вклад, спасибо!
Ответ №1:
Атрибут фильтра ячейки таблицы идентификаторов неверен.
<td data-title="'id'" sortable="'id'" filter="{ 'id': 'text' }">
{{variant.id}}
</td>
Измените его на:
<td data-title="'id'" sortable="'id'" filter="variantFilterDef">
{{variant.id}}
</td>
Редактировать
После нескольких проб и ошибок у меня это работает. Я начал с вашего примера кода и внес ряд изменений. Я использовал синтаксис controllerAs. Но, по сути, исправления:
-
<td data-title="'chrom'" sortable="'chrom'" filter="{ 'chrom': 'text' }">
Для
<td data-title="'chrom'" sortable="'chrom'" filter="{ 'name': 'text' }">
-
<td data-title="'pos'" sortable = "'pos'" filter = "{ 'pos': 'text' }">
Для
<td data-title="'pos'" sortable="'pos'" filter="variantCtrl.variantFilterDef">
-
if (params.filter()) {
self.data = $filter('filter')(self.data, {name: params.filter().name});
self.data = variantRangeFilter(self.data, params.filter());
} else {
self.data = self.data;
}
Основной проблемой была необходимость разделения фильтров двух столбцов в # 3 с помощью {name: params.filter().name})
amp;, а затем отдельного вызова пользовательского Pos-фильтра.
Комментарии:
1. В примере Codepen используется
<td data-title="'Age'" filter="demo.ageFilterDef">
2. Я знаю, что я только что опубликовал ответы, с которыми я работал. Я пробовал это, и в примере code pen используется demo(имя контроллера).ageFilterDef и я попробовал mycontroller.variantFilterDef, и это не сработало.
3. Мне нужен способ реализовать эту функцию внутри моей функции getData, потому что все функции фильтра выполняются внутри нее.
4. У меня есть еще закомментированный js-код, если вы прокрутите вниз ниже.
5. Если вы можете опубликовать более полный пример кода с контроллером и html, я могу помочь диагностировать и протестировать мой ответ