自动匹配的输入 - 前台架构

自动匹配,使用的场景提供查询过程通过输入的变化,第一时间完成响应,几乎可以达到实时的显示查询的结果,区别于选择框的方式,更加友好的提供查询功能。

自动匹配

自动匹配控件的支持,不仅仅通过固定的查询内容作为数据范围提供匹配的过程,而是通过输入内容的变化,通过接口完成请求,利用响应的结果进行显示,完成类似选择的效果来实现几乎实时的查询效果。

所以,查询的方式可以分为两类,一是支持固定查询数据范围的自动匹配,二是通过参数请求的方式完成自动匹配。通过一种控件的方式,实现两种不同查询方式的实现。

自动匹配功能控件,一般前台框架都有相应的支持。一般是利用输入框聚焦的同时,提供一个下拉效果,而下拉效果中存在一个输入框提供查询内容的输入过程。选择Typeahead的一个原因,可以利用普通的输入框来实现自动匹配的方式,不需要特殊的效果支持进行实现。

Typeahead与选择框功能类似的同时,存在一个较为麻烦的处理过程,就是获取选择值的处理。一般情况去,利用val类似的方法来获取选择值对应的键值,之后根据具体的业务来完成后续的操作。但是,存在一些特殊的场景,根据请求的过程来订制响应结果中显示内容以及对应的键值,来做到不同业务、不同功能的统一处理。所以,在Typeahead原有的功能基础上,调整开源代码来支持该特性。

利用Typeahead支持的同时,前台架构中拓展特定的方法来简化模块调用过程。主要提供初始化、获取值、更新、重置、清空对应的处理过程。

引用代码,框架为JQuery作为基础,控件为Layer和Typeahead作为功能。

...
/**
 * 初始化自动补全 , 利用接口完成基础数据获取
 * @param id 页面标签/元素ID/样式class
 * @param url 请求地址
 * @param args 请求参数
 * @param result 返回结果名称
 * @param key 补全元素key值
 * @param value 补全元素value值
 * @param callback 回调方法 , 选中元素之后执行
 */
core.autoTypeahead: function (container, url, name, args, result, key, value, callback){

    // 根据参数不同类型 , 获取容器对象
    if(container && typeof(container) == "object" && container.length) container = container;
    else if(container && typeof(container) == "object") container = [container];
    else if(container && typeof(container) == "string") container = core.focusPage(!/\W+/.test(container) ? '#' + container : container);
    else return false;

    // 初始化容器为自动匹配控件
    var $ele = container.typeahead({
        url: url,
        list: [],
        postData: {},
        source: function (query, process) {
            var options = {};
            options[name] = query;
            core.post(this.options.url, $.extend(options, args), $.proxy(this.options.callback, this));
        }, matcher: function (item) {
            return true;
        }, callback: function (data) {
            this.options.list = data[result];
            this.flprocess(this.options.list, key, value);
        },
        isResultTypeMap: true,
        flupdater: function (k, v) {
            if(callback) return callback(this.options.list, k, v);
            else return v;
        }
    });
},
...
...
/**
 * 初始化自动补全 , 提供基础数据 , 无需发生请求
 * @param id 页面标签/元素ID/样式class
 * @param data 基础数据
 * @param key 补全元素key值
 * @param value 补全元素value值
 * @param callback 回调方法 , 选中元素之后执行
 */
core.selectTypeahead: function (container, data, key, value, callback){

    // 根据参数不同类型 , 获取容器对象
    if(container && typeof(container) == "object" && container.length) container = container;
    else if(container && typeof(container) == "object") container = [container];
    else if(container && typeof(container) == "string") container = core.focusPage(!/\W+/.test(container) ? '#' + container : container);
    else return false;

    // 初始化容器为自动匹配控件
    var $ele = container.typeahead({
        list: data,
        source: function (query, process) {

            var res = [];
            var data = this.options.list;

            // 判断查询内容长度 , 小于2则返回固定结果 , 否则根据内容进行查询
            if(query.length < 2){
                res = data.slice(0, 5);
            }else{
                $.each(data, function(i, v){
                    if(v[value].indexOf(query) != -1) res.push(v);
                });
            }
            $.proxy(this.options.callback, this)(res);
        }, matcher: function (item) {
            return true;
        }, callback: function (list) {
            this.flprocess(list, key, value);
        },
        isResultTypeMap: true,
        flupdater: function (k, v) {
            if(callback) return callback(this.options.list, k, v);
            else return v;
        }
    });
},
...
...
/**
 * 获取自动补全key值
 * @param id 页面标签/元素ID
 * @param defaults 请求地址
 * @param isKey 是否获取key , 否则为val的信息
 * @return 自动补全的key/value
 */
core.typeahead: function(container, defaults, isKey){

    // 根据参数不同类型 , 获取容器对象
    if(container && typeof(container) == "object" && container.length) container = container;
    else if(container && typeof(container) == "object") container = [container];
    else if(container && typeof(container) == "string") container = core.focusPage(!/\W+/.test(container) ? '#' + container : container);
    else return false;

    var _ = container.attr('data-typeahead-key');
    if(isKey) _ = container.val();
    if(!defaults) defaults = '';
    return  _ ? _ : defaults;
},
...
...
/**
 * 更新自动补全 , 显示内容 , 对应key值
 * @param id 页面标签/元素ID
 * @param key 补全元素key值
 * @param value 补全元素value值
 */
core.updateTypeahead: function(container, key, value){

    // 根据参数不同类型 , 获取容器对象
    if(container && typeof(container) == "object" && container.length) container = container;
    else if(container && typeof(container) == "object") container = [container];
    else if(container && typeof(container) == "string") container = core.focusPage(!/\W+/.test(container) ? '#' + container : container);
    else return false;

    container.val(value).attr('data-typeahead-key', key);
},
...
...
/**
 * 重置自动补全数据源
 * @param id 页面标签/元素ID
 * @param data 数据源
 */
core.resetTypeahead: function(container, data){

    // 根据参数不同类型 , 获取容器对象
    if(container && typeof(container) == "object" && container.length) container = container;
    else if(container && typeof(container) == "object") container = [container];
    else if(container && typeof(container) == "string") container = core.focusPage(!/\W+/.test(container) ? '#' + container : container);
    else return false;

    container.typeahead("list", data)
},
...
...
/**
 * 获取自动补全对应key值
 * @param id 页面标签/元素ID
 */
core.cleanTypeahead: function(container){

    // 根据参数不同类型 , 获取容器对象
    if(container && typeof(container) == "object" && container.length) container = container;
    else if(container && typeof(container) == "object") container = [container];
    else if(container && typeof(container) == "string") container = core.focusPage(!/\W+/.test(container) ? '#' + container : container);
    else return false;

    container.val("").removeAttr('data-typeahead-key');
},
...

JQuery更多使用说明,参考JQuery官方网站。
Typeahead具体使用方法,参考Typeahead官方网站。
LayUI(Layer)所有使用方式,参考LayUI官方网站,了解更多功能。

你可能感兴趣的:(自动匹配的输入 - 前台架构)