【问题标题】:Dynamically change searchable datatable column property动态更改可搜索数据表列属性
【发布时间】:2017-10-17 04:42:19
【问题描述】:

在初始化数据表后,我必须更改一个函数,bSearchable 列的属性。我需要先启用然后禁用它。

我找到了一个可见性示例:

$(document).ready(function() {
    var table = $('#example').DataTable( {
        "scrollY": "200px",
        "paging": false
    } );

    $('a.toggle-vis').on( 'click', function (e) {
        e.preventDefault();

        // Get the column API object
        var column = table.column( $(this).attr('data-column') );

        // Toggle the visibility
        column.visible( ! column.visible() );
    } );
} );

在我的情况下也可以使用类似的东西吗? column.seachable 之类的东西?

【问题讨论】:

  • 你能澄清一下你需要做什么吗?它与 C# 标签有什么关系
  • 请更具体。为什么以及何时要设置可搜索?除非“某事”需要发生并且然后应该禁用可搜索,否则它不会完全加起来。
  • 我需要这个,因为数据表搜索提供的“全局”搜索在所有现有列的输入字段中输入值。我想限制对一个隐藏列的搜索,但是当我调用我创建的函数时,我需要在该列上执行搜索,所以我应该激活这个属性然后停用它
  • 我相信你必须在调用你的函数后重新初始化表
  • 该函数在按钮点击时被调用。每次点击后我必须重新初始化?

标签: javascript jquery datatables


【解决方案1】:

这是一个古老的问题,但我花了几个小时来研究答案……但主要是因为我缺乏 JS 技能。

用例是我有一个 ID 列为GUID 的表。这个id很少使用,占用空间很大,所以默认是隐藏的,不可搜索的。但是对于可能有权访问日志或数据库的内部用户,我们还需要能够搜索 ID 列。

我为这些用户添加了一个复选框,它应该会更改 ID 列的可见性和可搜索属性。 我的解决方案基于another question regarding searching on columns。但在这个问题中,搜索只针对一个列,而不是所有可搜索列(普通DataTable.search() API)。可悲的是,要更改 searchable 属性,似乎没有公共 API。如果更改searchable 属性,则必须在之后使表中的数据无效,否则列数据仍将存在/不存在于表aoFilterData 中。这会强制表从数据源(在本例中为 DOM)重新加载数据。

在正确的位置注册事件处理程序时遇到了很多问题。在表的第一个draw 事件中不存在过滤器字段,因此我必须在表完全初始化后触发的init 事件中注册处理程序。

var userTable;
var idSearchCbx;
var searchField;

$(document).ready(function () {
userTable = document.getElementById("table-users");
if (userTable) {
    userTable = $("#table-users").DataTable(
        {
            "columnDefs": [
                {
                    //First column invisible and not searchable by default
                    "targets": [0], //first column = ID
                    "visible": false,
                    "searchable": false
                }],
          //Other initialization options
    ); //Table creation
    userTable.on("init",
        function () {
            $("input[type='search']").on("change cut input keypress keyup paste search recheck",
                function () {
                    var searchValue = $(this).val();
                    userTable.search(searchValue).draw();
                    //width attribute is calculated and added to the table
                    //it loses 2 pixels everytime the checkbox is checked/
                    //unchecked somehow - so delete it
                    document.getElementById("table-users").removeAttribute("style");
                });

            idSearchCbx = $("#cbx-search-id");
            idSearchCbx.on("change",
                function () {
                    if (this.checked === true) {
                        //this makes the first column searchable, not official API
                        userTable.context[0].aoColumns[0].bSearchable = true;
                        //make it visible as well, official API
                        userTable.columns(0).visible(true);
                        //invalidates cached table data so that the column values are
                        //added to the filterdata
                        userTable.rows().invalidate().draw();
                    } else {
                        userTable.context[0].aoColumns[0].bSearchable = false;
                        userTable.columns(0).visible(false);
                        userTable.rows().invalidate().draw();
                    }
                    //trigger the normal search again so that the
                    //filter is / is not applied to the first column
                    $("input[type='search']").trigger("recheck");
                });
        }); //DT on init
    } //table present
});//document ready

我假设上下文与settings() 相关,因此请记住,上下文中的名称可能会更改,即使在次要版本中,这也很可能不是版本稳定的。但是我没有找到其他方法。希望它可以帮助某人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-22
    • 2011-11-08
    • 1970-01-01
    • 2019-08-11
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多