SearchBuilder 插件

SearchBuilder 在其提供的默认过滤方法中已非常有用,但是如果你想要添加你自己的条件或更改已经存在的条件,该怎么办?这可以通过创建一个插件来完成。

必需的参数

当你为 SearchBuilder 创建一个插件时,将一个对象添加到 searchBuilder.conditions 对象中,基于当应该应用插件的数据类型(columns.type)。你所有的自定义插件对象中都必须定义以下属性

在初始化期间定义

例如,让我们假设你需要为 num 类型创建一个条件,检查 num 是否能被用户输入的值整除。我们将把此条件称为倍数。首先,我们在 SearchBuilder 配置中将 num 条件添加如下。

$('#myTable').DataTable( {
    searchBuilder:{
        conditions:{
            num:{
                multipleOf: {
                    ...
                }
            }
        }
    }
})

我们希望我们的条件在下拉列表中显示为 Multiple Of,因此我们将 searchBuilder.conditions[type].conditionName 属性设置为 'Multiple Of',如下所示(此处仅显示插件对象以简洁明了)

multipleOf: {
    conditionName: 'Multiple Of',
    ...
}

接下来,我们希望用户能够输入他们想要的任何值,所以我们将去 searchBuilder.conditions[type].init 函数来初始化 input 元素。如何执行此操作的深度描述 在此 提供

我们在 searchBuilder.conditions[type].init 函数中这样执行。

multipleOf: {
    conditionName: 'Multiple Of',
    init: function (that, fn, preDefined = null) {
        var el =  $('<input/>').on('input', function() { fn(that, this) });

        if (preDefined !== null) {
            $(el).val(preDefined[0]);
        }

        return el;
    },
    ...
}

接下来需要添加的属性是 searchBuilder.conditions[type].inputValue。此函数从我们刚刚创建的 jQuery 元素中提取值,并返回该值以在搜索中使用。如何执行此操作的深度描述 在此 提供

multipleOf: {
    conditionName: 'Multiple Of',
    init: function (that, fn, preDefined = null) {
        var el =  $('<input/>').on('input', function() { fn(that, this) });

        if (preDefined !== null) {
            $(el).val(preDefined[0]);
        }

        return el;
    },
    inputValue: function (el) {
        return $(el[0]).val();
    }
    ...
}

接下来是 searchBuilder.conditions[type].isInputValid 函数。此函数返回一个布尔值,指示是否应将该条件包括在搜索中。如果输入元素中有一个值,我们才希望包括该条件。如何执行此操作的深度描述 在此 提供

multipleOf: {
    conditionName: 'Multiple Of',
    init: function (that, fn, preDefined = null) {
        var el =  $('<input/>').on('input', function() { fn(that, this) });

        if (preDefined !== null) {
            $(el).val(preDefined[0]);
        }

        return el;
    },
    inputValue: function (el) {
        return $(el[0]).val();
    },
    isInputValid: function (el, that) {
        return $(element[0]).val().length !== 0;
    },
    ...
}

最后,我们需要提供搜索函数,该函数将确定是否应将该行包括在筛选器结果中,如果 searchBuilder.conditions[type].isInputValid 允许该条件。如何执行此操作的深度描述 在此 提供

$('#myTable').DataTable( {
    dom: 'Qlfrtip',
    searchBuilder:{
        conditions:{
            num:{
                multipleOf: {
                    conditionName: 'Multiple Of',
                    init: function (that, fn, preDefined = null) {
                        var el =  $('<input/>').on('input', function() { fn(that, this) });

                        if (preDefined !== null) {
                            $(el).val(preDefined[0]);
                        }

                        return el;
                    },
                    inputValue: function (el) {
                        return $(el[0]).val();
                    },
                    isInputValid: function (el, that) {
                        return $(el[0]).val().length !== 0;
                    },
                    search: function (value, comparison) {
                        return value % comparison === 0;
                    }
                }
            }
        }
    }
})

就是这样,一个非常简单的插件已经完成了!你可以在 此示例 中看到它的实际操作

自定义列类型

还可以为你在表中激活的任何自定义 column.type 添加条件。假设你有类型为 multipleNum 的列,你想添加上述条件,你可以这样初始化。

$('#myTable').DataTable( {
    dom: 'Qlfrtip',
    searchBuilder:{
        conditions:{
            multipleNum:{
                multipleOf: {
                    conditionName: 'Multiple Of',
                    init: function (that, fn, preDefined = null) {
                        var el =  $('<input/>').on('input', function() { fn(that, this) });

                        if (preDefined !== null) {
                            $(el).val(preDefined[0]);
                        }

                        return el;
                    },
                    inputValue: function (el) {
                        return $(el[0]).val();
                    },
                    isInputValid: function (el, that) {
                        return $(el[0]).val().length !== 0;
                    },
                    search: function (value, comparison) {
                        return value%comparison === 0;
                    }
                }
            }
        }
    }
    })

静态定义

在初始化过程中定义一个插件对单个表很有用,但如果你想在多张表上使用它,那么它会限制核心重用选项。为此,你可以扩展或修改 SearchBuilder 的 conditions 对象

$.fn.dataTable.ext.searchBuilder.conditions.num.multipleOf = {
    conditionName: 'Multiple Of',
    init: function (that, fn, preDefined = null) {
        var el =  $('<input/>').on('input', function() { fn(that, this) });

        if (preDefined !== null) {
            $(el).val(preDefined[0]);
        }

        return el;
    },
    inputValue: function (el) {
        return $(el[0]).val();
    },
    isInputValid: function (el, that) {
        return $(el[0]).val().length !== 0;
    },
    search: function (value, comparison) {
        return value%comparison === 0;
    }
};

$('#myTable').DataTable({
    dom: 'Qfrtip'
});

请注意,对象中的所有属性都与上述完全相同。

如果你创建了一个使用此方法的插件条件并且想与 DataTables 社区分享,那么我们非常愿意 听取你的意见