select2异步获取(ajax)数据带记忆功能

DATE: 2019-11-18 / VIEWS: 6673

主要解决搜索过的关键词就不用ajax去后端取数据了,用已存数据展示即可,相当于把数据记录记忆了,减少后端的压力。

var parent = $("#parentid"), dataCaches = Array(), timeEr = null;
$.fn.select2.amd.define('select2/data/customAdapter', [
        'select2/data/array',
        'select2/utils'
    ],
    function (ArrayAdapter, Utils) {
        function CustomDataAdapter($element, options) {
            CustomDataAdapter.__super__.constructor.call(this, $element, options);
        }
        Utils.Extend(CustomDataAdapter, ArrayAdapter);
        CustomDataAdapter.prototype.query = function (q, callback) {
            var key = q.term;
            if (!key || key.length < 2 || /^[a-zA-Z1-9]+$/.test(key)) {
                return false;
            }
            var dataCache = dataCaches[key];
            if (dataCache) {
                callback({results: dataCache});
            } else {
                timeEr && window.clearTimeout(timeEr);
                timeEr = window.setTimeout(function () {
                    $.ajax({
                        url: '/api/article/get_list',
                        data: {name: key, puid: puid},
                        dataType: 'json',
                        type: 'POST',
                        success: function (data) {
                            var _data = [];
                            if (data.length > 0) {
                                for (d in data) {
                                    _data.push({
                                        id: data[d].id,
                                        text: data[d].name + "(" + data[d].id + ")"
                                    });
                                }
                            }
                            dataCaches[key] = _data;
                            callback({results: _data});
                        }
                    })
                }, 500);
            }
        };
        return CustomDataAdapter;
    }
);
var customAdapter = $.fn.select2.amd.require('select2/data/customAdapter');
parent.select2({
    language: "zh-CN",
    dataAdapter: customAdapter
});