使用 select2 4 的数据适配器出错

Error with Data Adapter with select2 4

我试图在我的组合框中使用超过 10000 个数据,我有这段代码

$.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 (params,callback) {
            console.log(params);
           var pageSize,
                    results;
                    pageSize = 20;
                    results  = _.filter(content, function (e) {
                        return (params.term === "" || e.text.toUpperCase().indexOf(params.term.toUpperCase()) >= 0);
                 });
                 console.log(results);
                 callback({
                    results: results.slice((params.page - 1) * pageSize, params.page * pageSize),
                    // retrieve more when user hits bottom
                    more   : results.length >= params.page * pageSize
                });
        };

        return CustomDataAdapter;
    }
);

var customAdapter=$.fn.select2.amd.require('select2/data/customAdapter');
    objCmb.select2({
        allowClear: true, 
        disabled: dis, 
        placeholder: Empty, 
        data: content, 
        formatLoadMore   : 'Loading more...',
        dataAdapter:customAdapter

    });

当我使用 select2 时出现这个错误

类型错误:params.term 未定义

...ms.term === "" || e.text.toUpperCase().indexOf(params.term.toUpperCase()) >= 0)

问题是当有人聚焦 select2 控件时,并没有真正的 term,所以 params 对象是空的(例如 {})。您可以在 this JsFiddle 中看到它(只需尝试搜索一些东西)。

如果您想消除该错误,您可以修改您的自定义 query 函数来解决这个问题:

CustomDataAdapter.prototype.query = function (params, callback) {
    var pageSize, results;
    pageSize = 20;
    results = _.filter(content, function (e) {
        return (params.term == null || params.term === "" || e.text.toUpperCase().indexOf(params.term.toUpperCase()) >= 0);
             // ^^^^^^^^^^^^^^^^^^^
    });
    callback({
        results: results.slice((params.page - 1) * pageSize, params.page * pageSize),
        more: results.length >= params.page * pageSize
    });
};

这将如您所愿地工作 (modified fiddle)。

我还想指出,您的代码示例不包括 select 带有项目的人口,因此它也不存在于上述小提琴中。