datatables - 数据表的单个下拉过滤
问题描述
我已经苦苦挣扎了几天,试图获得一个下拉列表来过滤我的表格。选择 eraId 后,应刷新列以仅显示所选 eraId 的列。
这就是我的表格的样子:
我在 Datatables 网站或论坛上阅读了很多示例,但我似乎找不到有用的东西。
我设法创建了一个下拉菜单,其中包含不同的 EraIds 作为过滤器(我已经简化了下面的示例,只有 3 个 eraIds),但是在下拉菜单中选择一个条目后,表格变空并且列列表没有刷新。
我认为问题在于我首先根据 检索列名称,eraId
然后相应地绘制表格,仅显示来自特定 eraId 的资源。我已经尝试了几件事,但没有成功。
理想情况下,我应该使用选定的 eraId 进行回调getPlayerResourceTable
,或者使用选定的 eraId 上的资源更新列列表。
Javascript:
var columns = [];
function getPlayerResourceTable($selectedEraId) {
$.ajax({
type: "POST",
url: "./graphs.php",
data: { call_function : 'getResourceTableColumns', eraId: $selectedEraId},
success: function (data) {
data = JSON.parse(data);
columnNames = Object.keys(data.data);
for (var i in data.data) {
columns.push({data: data.data[i],
title: data.data[i]});
}
$('#playerResourceTable').DataTable( {
processing: true,
serverSide: false,
filter: true,
columns: columns,
ajax: {
url: './graphs.php',
type: 'POST',
data: { call_function: 'playerResourceTable', column_fields : data.data, eraId: $selectedEraId}
},
initComplete: function () {
this.api().columns( 0 ).every( function () {
var column = this;
var select = $('<select><option value=""></option></select>')
.appendTo( $("#playerResourceTablesWrapper .dataTables_filter"))
.on( 'change', function () {
var val = $.fn.dataTable.util.escapeRegex(
$(this).val()
);
column.search( this.value ).draw();
} );
select.append( '<option value="1">Era 1</option>' )
select.append( '<option value="2">Era 2</option>' )
select.append( '<option value="3">Era 3</option>' )
} );
}
});
}
});
}
$(document).ready(function() {
$selectedEraId = 1;
getPlayerResourceTable($selectedEraId);
} );
PHP:
getResourceTableColumns
返回与查询类似的列列表SELECT columnName FROM ages WHERE eraId = ?
playerResourceTable
返回每列(资源类型)的资源,查询类似于SELECT ".$field_list." FROM user_resources
我还想过在我的 MySQL 查询中删除WHERE eraId = ?
并过滤客户端的列,但也没有运气。
解决方案
我最终在更改 Era 时将这两个功能分开并销毁/重新创建表。
function getColumns($selectedEraId) {
var columns = [];
$.ajax({
type: "POST",
url: "./graphs.php",
data: { call_function : 'getResourceTableColumns', eraId: $selectedEraId},
success: function (data) {
data = JSON.parse(data);
for (var i in data.data) {
columns.push({data: data.data[i],
title: data.data[i]});
}
if ( $.fn.dataTable.isDataTable( '#playerResourceTable' ) ) { // If the table already exists, detroy it before creating it again
$('#playerResourceTable').DataTable().destroy();
}
getPlayerResourceTable($selectedEraId, columns); // Will recreate the table with the new columns
}
});
}
function getPlayerResourceTable($selectedEraId, columns_to_show) {
$city_id = 91;
$playerResourceTable = $('#playerResourceTable').DataTable( {
processing: true,
serverSide: false,
filter: true,
columns: columns_to_show,
ajax: {
url: './graphs.php',
type: 'POST',
data: { call_function: 'playerResourceTable', column_fields : columns_to_show, city_id : parseInt($city_id)}
},
initComplete: function () {
this.api().columns( 0 ).every( function () {
var column = this;
var select = $('<select id="selectEraId" ><option value=""></option></select>')
.appendTo( $("#playerResourceTablesWrapper .dataTables_filter"))
.on( 'change', function () {
var val = $.fn.dataTable.util.escapeRegex(
$(this).val()
);
column.search( this.value ).draw();
} );
dropdown_string = getEraDropdown($selectedEraId);
} );
$('#selectEraId').on('change', function() {
$selectedEraId = this.value;
columns_to_show = getColumns($selectedEraId);
});
}
});
}
推荐阅读
- amazon-web-services - AWS 运行 Lambda 从 IOT 主题中读取
- php - How to make an override for a function in a php file
- javascript - Why do I get an EJS syntax error when trying to print strings from an array?
- typescript - TypeScript:如何告诉 TypeScript 我是哪种情况?
- r - 整理数据中的符号 (£)
- pandas - Merge two csv files that have a similar row structure but no common index between them
- git - 为什么 sourcetree 总是显示远程分支?
- micronaut - Howto setup POJO validation in reactive micronaut
- php - PHP 中的内容查询内容类型
- java - Scala:无法取消引用 List[scala.collection.immutable.HashMap[String,Double]]