Jquery Tablesorter的filter_selectSource删除服务器端分页当前页面不可用的选项,然后选择选项preparation
我正在为Python/Django中的Tablesorter准备带有选项的数组。因为最初,当我切换到服务器端过滤时,它对我来说非常奇怪。只有当我在一个“搜索”过滤器中键入一个符号,然后每次它显示一个步骤之前可用的选择选项时,下拉选项才会显示。 然后我决定尝试在服务器端完成大部分工作 玩家的观点Jquery Tablesorter的filter_selectSource删除服务器端分页当前页面不可用的选项,然后选择选项preparation,jquery,django,ajax,tablesorter,Jquery,Django,Ajax,Tablesorter,我正在为Python/Django中的Tablesorter准备带有选项的数组。因为最初,当我切换到服务器端过滤时,它对我来说非常奇怪。只有当我在一个“搜索”过滤器中键入一个符号,然后每次它显示一个步骤之前可用的选择选项时,下拉选项才会显示。 然后我决定尝试在服务器端完成大部分工作 玩家的观点 def skaters_averages_json(request, page, sort_col, filt_col, rookie_filt): start = utils.PAGE_SIZ
def skaters_averages_json(request, page, sort_col, filt_col, rookie_filt):
start = utils.PAGE_SIZE_2*(page - 1)
end = start + utils.PAGE_SIZE_2
skaters = Skater.objects.select_related('team')
filtering = utils.filter_columns(filt_col)
if filtering:
skaters = utils.apply_filters(skaters, filtering)
if utils.rookie_filter(rookie_filt):
skaters = skaters.filter(rookie=True)
sorting = utils.sorting_columns(sort_col)
one_page_slice = utils.sort_table(sorting, skaters)[start:end]
skaters_json = json.loads(serializers.serialize('json', one_page_slice,
use_natural_foreign_keys=True))
domain = request.get_host()
total_rows = skaters.count()
data = utils.process_json(domain, skaters_json, total_rows, page)
data['filter_select'] = {
**utils.filter_select_opts(skaters, 3, 'position_abbr'),
**utils.filter_select_opts(skaters, 4, 'team__abbr'),
**utils.filter_select_opts(skaters, 5, 'nation_abbr'),
}
return JsonResponse(data, safe=False)
玩家。乌提尔
def filter_select_opts(skaters_query, col_number, field_name):
uniques = list(skaters_query.values_list(field_name, flat=True).distinct())
return {col_number: sorted(uniques, key=lambda x: (x is None, x))}
所以我的JSONResponse看起来像这样
第1页
{
"total": 41,
"rows": [
[row 1],
...
[row 25]
],
"filter_select": {
"3": [
"C",
"D",
"LW",
"RW"
],
"4": [
"ANA",
"BOS",
"BUF",
"CAR",
"CBJ",
"CGY",
"CHI",
"COL",
"DAL",
"EDM",
"FLA",
"MIN",
"MTL",
"NJD",
"NSH",
"NYI",
"PHI",
"PIT",
"SJS",
"TOR",
"VAN",
"VGK",
"WPG"
],
"5": [
"FIN"
]
}
}
第2页
{
"total": 41,
"rows": [
[row 26],
...
[row 41]
],
"filter_select": {
"3": [
"C",
"D",
"LW",
"RW"
],
"4": [
"ANA",
"BOS",
"BUF",
"CAR",
"CBJ",
"CGY",
"CHI",
"COL",
"DAL",
"EDM",
"FLA",
"MIN",
"MTL",
"NJD",
"NSH",
"NYI",
"PHI",
"PIT",
"SJS",
"TOR",
"VAN",
"VGK",
"WPG"
],
"5": [
"FIN"
]
}
}
应用的筛选器响应的第二页显示了与filter_selectSource相同的值,但当我在filter_selectSource处理后查看相同的页面时,它仅显示当前可见页面上可用的选项。
有没有一种方法可以覆盖这种行为
阅读和的文档。找不到我想要的
external.js
let selectOptions;
$("#tab1")
.tablesorter({
headers: {
0: {sorter: false, filter: false},
1: {filter: false},
2: {filter: false},
},
widgets: ['filter'],
widgetOptions : {
filter_selectSource: selectOptions,
filter_reset: '.reset',
filter_external : '.select',
}
})
.tablesorterPager({
container: $(".pager-s"),
size: 25,
output: '{page} / {totalPages}',
savePages: false,
fixedHeight: false,
ajaxUrl: 'http://127.0.0.1:8000/skaters_averages_json/{page+1}/{sort:col}/{filter:fcol}',
customAjaxUrl: function(table, url) {
if ($("#tab1").data('filter_value')) {
return url += '/rookie_filter=' + $("#tab1").data('filter_value');
};
return url += '/rookie_filter=';
},
ajaxObject: {
success: function(data) {
selectOptions = data['filter_select'];
$("#tab1").trigger("updateAll");
console.log(selectOptions);
},
dataType: 'json',
type: 'GET'
},
});
$('.rookie-filter').on('change', function(){
let checked = $(this).is(":checked");
$("#tab1").data('filter_value', checked).trigger('pagerUpdate', 1);
if (checked) {
$(this).attr('title', 'Show all players')
} else {
$(this).attr('title', 'Show rookies only')
};
});
$('.reset').on('click', function(){
$('.rookie-filter').prop('checked', false);
$("#tab1").data('filter_value', $(this).is(":checked")).trigger('pagerUpdate');
});
$('table').bind("sortEnd", function(){
$(this).trigger('pageSet', 1);
});
我还在我的external.js文件中记录selectOptions,以确保得到预期的结果
更新。
正如@Mottie在评论中所建议的那样,我们一直在努力使它与buildSelect一起工作。
事实证明,filter\u selectSource实际上不接受我的变量infilter\u selectSource:selectOptions,唯一有区别的行是$tab1.triggerUpdateAllianajaxObject`。Tablesorter然后自动显示当前页面上可用的选项
所以,现在我正在努力触发过滤器行的更新。
我可以一次加载一列的预期选项,但由于递归错误太多,该表无法工作。
每个filter\u selectSource中的$'body'.triggerfilter\u事件会导致大量的表更新。但如果没有它,下拉菜单的选项是空的。我已尝试将此更新绑定到不同的服务器。就像过滤器一样。不适合我。
看看下面我更新的脚本。关于如何使其在不重复多次的情况下更新筛选器行,有何建议
$("#tab1").data('statType', 'tot');
let pos = [];
let team = [];
let nation = [];
let filter_event = jQuery.Event("load_filter_select");
$("#tab1")
.tablesorter({
headers: {
0: {sorter: false, filter: false},
1: {filter: false},
2: {filter: false},
},
widgets: ['filter'],
widgetOptions : {
filter_selectSource: {
3 : function(table, column, onlyAvail) {
result = pos;
$.tablesorter.filter.buildSelect(table, column, result, true);
$('body').trigger(event);
},
4 : function(table, column) {
result = team;
$.tablesorter.filter.buildSelect(table, column, result, true);
$('body').trigger(filter_event);
},
5 : function(table, column) {
result = nation;
$.tablesorter.filter.buildSelect(table, column, result, true);
$('body').trigger(filter_event);
},
},
filter_reset: '.reset',
filter_external : '.select',
}
})
.tablesorterPager({
container: $(".pager-s"),
size: 25,
output: '{page} / {totalPages}',
savePages: false,
fixedHeight: false,
ajaxUrl: 'http://127.0.0.1:8000/skaters_averages_json?/{page+1}/{sort:col}/{filter:fcol}',
customAjaxUrl: function(table, url) {
urlParts = url.split('?');
url = urlParts[0] + `/${$("#tab1").data('statType')}` + urlParts[1];
if ($("#tab1").data('filter_value')) {
return url += '/rookie_filter=' + $("#tab1").data('filter_value');
};
return url += '/rookie_filter=';
},
ajaxObject: {
success: function(data) {
pos = data['filter_select'][3];
team = data['filter_select'][4];
nation = data['filter_select'][5];
$('body').trigger(filter_event);
},
dataType: 'json',
type: 'GET'
},
});
$('body').on('load_filter_select', function(){
$("#tab1").trigger('update');
});
在老师的大力帮助下,我终于解决了这个问题
我不应该触发任何更新。只需使用buildSelect函数从AJAX回调加载选项。
因此,使选择过滤器正常工作的完整脚本如下所示:
$("#tab1").data('statType', 'tot');
$("#tab1")
.tablesorter({
widgets: ['filter'],
widgetOptions: {
filter_selectSource : {
".filter-select" : function() { return null; }
},
}
})
.tablesorterPager({
container: $(".pager-s"),
size: 25,
output: '{page} / {totalPages}',
savePages: false,
fixedHeight: false,
ajaxUrl: 'http://127.0.0.1:8000/ajax_players?/{page+1}/{sort:col}/{filter:fcol}',
customAjaxUrl: function(table, url) {
urlParts = url.split('?');
url = urlParts[0] + `/${$("#tab1").data('statType')}` + urlParts[1];
if ($("#tab1").data('filter_value')) {
return url += '/rookie_filter=' + $("#tab1").data('filter_value');
};
return url += '/rookie_filter=';
},
ajaxObject: {
success: function(data) {
table = $("#tab1");
options = data['filter_select'];
for (let column = 3; column <= 5; column++) {
$.tablesorter.filter.buildSelect(table, column, options[column], true);
};
},
dataType: 'json',
type: 'GET'
},
});
更新。事实上,我刚刚弄明白了为什么这个解决方案在某些情况下不能像预期的那样工作。我忘了将filter_selectSource:{.filter select:function{return null;}}添加到小部件选项中。如果函数没有返回null filter,\u selectSource试图覆盖buildSelect所做的选项。我已经编辑了代码。也许可以试试使用buildSelect的方法?@Mottie,我已经更新了我的答案,如果你有时间,请看一看。嗯,你不需要在调用buildSelect后触发更新。实际上,我认为,您可以从ajax回调中调用buildSelect函数,而不是将其全部添加到filter_selectSource选项中。另外,我不建议触发updateAll,除非表头内容发生更改。您是否可以设置一个演示?那我就更容易帮你了。@Mottie,哇,这很有魅力!在ajax回调中只有几行代码-table=$tab1;选项=数据['filter_select'];对于let列=3;@Mottie列,是否添加此作为答案?还是我应该自己做?