【问题标题】:Datatables yadcf plugin filling select filters with data from serverDatatables yadcf 插件使用来自服务器的数据填充选择过滤器
【发布时间】:2015-03-18 09:54:34
【问题描述】:

首先我很感谢这个神奇的插件。

我使用的是 yadcf 版本 0.8.8.beta.10。

我正在尝试从服务器获取选择过滤器数据。但是当表被初始化时,选择数据是从 dom 中获取的。如果我按过滤器按钮调用 exFilterExternallyTriggered(table) 或按列排序按钮,则选择过滤器中的数据将使用来自服务器的数据进行更新。

这里是javascript

var table = $('#' + table_id).DataTable({
            "scrollX": true,
            "processing": true,
            "serverSide": true,
            "fnDrawCallback": function( oSettings ) {
              fixDropDowns();
            },
            "order": [[ 15, "desc" ]],
            "ajax": {
                "url": "${createLink(action: 'DataTableAjaxHandler')}",
            },
            "columns": [
             {"data": "edit",
                "searchable": false,
                "sortable": false,
                },
            { "data": "subscriberId",
                "searchable": true,
                "sortable": true},
            { "data": "unitName",
                "searchable": true,
                "sortable": true},
            { "data": "networkType",
                "searchable": false,
                "sortable": true},
           .................................
            ],

            "sDom":"<'dt-toolbar'<'col-xs-18 col-sm-9 filterDiv'>r<'col-sm-3 col-xs-6 hidden-xs'l>>" +
            "t" +
            "<'dt-toolbar-footer'<'col-sm-6 col-xs-12 hidden-xs'i><'col-xs-12 col-sm-6'p>>",

            "autoWidth": true,
            "preDrawCallback": function () {
                // Initialize the responsive datatables helper once.
                if (!responsiveHelper_dt_basic) {
                    responsiveHelper_dt_basic = new ResponsiveDatatablesHelper($('#' + table_id), breakpointDefinition);
                }
            },
            "rowCallback": function (nRow) {
                responsiveHelper_dt_basic.createExpandIcon(nRow);
            },
            "drawCallback": function (oSettings) {
                responsiveHelper_dt_basic.respond();
            },
            "initComplete": function(){
                var filters = [
                        new Filter(1, "subscriberId", "${message(code: 'radioUnit.subscriberId.label')}"),
                        new Filter(2, "nameFilter", "${message(code: 'radioUnit.unitName.label')}"),
                        new Filter(3, "networkType", "${message(code: 'radioUnit.networkType.label')}"),
                ]

                initFilterInterface(this.api(), filters, "${message(code: 'filter.filterButton.text')}");

                setTimeout(function () {
                    yadcf.init(table, [
                    {
                        column_number: 1,
                        filter_type: "select",
                        filter_container_id: "subscriberId",
                        externally_triggered: true,
                        filter_reset_button_text: false
                    }, {
                        column_number: 2,
                        filter_container_id: "nameFilter",
                        externally_triggered: true,
                        filter_reset_button_text: false
                    }, {
                        column_number: 3,
                        filter_type: "text",
                        filter_container_id: "networkType",
                        externally_triggered: true,
                        filter_reset_button_text: false
                    }]);
                    }, 1000);

            }
        });

        new $.fn.dataTable.FixedColumns( table, {
            leftColumns: 2
        } );

这是我在数据表 init 上从服务器获取的 json:

{"draw":1,"recordsTotal":23,"recordsFiltered":19,
"yadcf_data_1":["somedata"],"yadcf_data_2"
:["someValue","test2","test2","test2"],"data":[...]} 

在数据表初始化之后: After init

点击过滤按钮或排序列后: After hitting filter

很抱歉上传照片到外部网站,因为我没有 10 个代表点我不能使用图片标签。

从数据表初始化后的图像中可以看出,它使用 dom,但在点击过滤器后,它使用我从服务器返回的值。因此,出于某种原因,从服务器首次加载数据时会忽略 yadcf_data_1、yadcf_data_2 值并使用 DOM。

也许我做错了。使用外部按钮触发搜索时,是否有办法从服务器中填充选择?

还有其他问题。是否可以将 select2 搜索与 ajax 一起使用。因为我的大表很少,将所有值从服务器发送到客户端需要一段时间。

【问题讨论】:

    标签: yadcf


    【解决方案1】:

    不客气,

    首先不需要在setTimeout里面使用yadcf.init

    你的服务器应该发送类似于流动的东西(从showcase page复制粘贴)

    aaData: [["Trident", "Internet Explorer 4.0", "Win 95+", "3/15/2015", "1"],…]
    draw: "2"
    recordsFiltered: 6
    recordsTotal: 57
    yadcf_data_0: ["KHTML", "Webkit", "Trident", "Misc", "Other browsers", "Tasman", "Presto", "Gecko"]
    yadcf_data_1: ["Nintendo DS browser", "Netscape Browser 8", "All others", "Lynx", "Mozilla 1.6", "Mozilla 1.5",…]
    yadcf_data_2: ["N800", "Win 95+ / Mac OS 8.6-9.2", "S60", "KDE 3.5", "Win XP SP2+", "KDE 3.3", "OSX.3", "KDE 3.1",…]
    yadcf_data_4: ["134", "0"]
    

    对于第二个问题:您指的是类似于following open issue 的东西吗?如果你这样做了,那么你可以提供一个例子I requested

    附言

    没有必要使用filter_reset_button_text: false,因为它在设置externally_triggered: true 时的默认行为(实际上最好在init 函数中为整个表而不是每列设置,请参阅example in showcase


    如果上述方法不起作用,我建议尝试 yadcf 之类的最小设置

    yadcf.init(table, [
    {
        column_number: 1,
        filter_container_id: "subscriberId"
    }, {
        column_number: 2,
        filter_container_id: "nameFilter"
    }, {
        column_number: 3,
        filter_type: "text",
        filter_container_id: "networkType",
    }]);
    

    这样您可能会查明问题(如果仍然无法正常工作,您可以提供指向您网页的链接)

    【讨论】:

    • 感谢您的快速响应和提示。抱歉,我要在一周后回帖。当我处理其他任务时,我感到很冷,忘记回信了,因为我的函数 initInterface(); 使用了超时。添加 DOM 元素。这些 DOM 元素是过滤器的容器。所以它会等待一秒钟来初始化过滤器容器。我已经更新了我的原始问题并添加了几张图片来解释我面临的问题。在数据表初始化之后,它从 DOM 加载数据,但是在我点击过滤器之后,它从服务器加载正确的值。服务器第一次返回正确的 JSON。
    • 抱歉,如果没有指向重现此场景的工作示例的链接,我将无能为力。
    • 没关系。我不能分享那个代码。但我会尝试在 jsfiddle 中重新创建这种行为。
    猜你喜欢
    • 2017-05-21
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多