select2 使用查询词过滤本地 JSON 数据结果

Posted

技术标签:

【中文标题】select2 使用查询词过滤本地 JSON 数据结果【英文标题】:select2 filter local JSON data results with query term 【发布时间】:2015-03-27 15:06:01 【问题描述】:

我正在实施 select2 版本 3.5.0。我在我的文档就绪函数中使用以下 jQuery:

jQuery.getJSON('/rest/call/to/retrieve/JSON').done(
  function( data ) 
     jQuery('#byProductName').select2(
         placeholder: 'Type any portion of a single product name...',
         allowClear: true,
         minimumInputLength: 0,
         multiple: true,
         id: function(data) return data.product; ,
         data: data,
         formatResult: function(data) return data.product; ,
         formatSelection: function(data) return data.product; ,
     );
  
);

html 隐藏输入元素:

<div id='freeForm'>
    <input name='Search Products' type='hidden' id='byProductName'>
</div>

JSON 结果:

["product":"","product":" windows","product":" mac",
 "product":" linux","product":" RHEL","product":"Test product list"]

下拉列表正确填充了我的值,我可以选择多个项目并成功删除它们。但是,当我在输入字段中键入字符串以过滤结果集时,它不会过滤。

我已尝试将数据:更改为以下内容:

data: function (data, term)
    return  
        results: data,
        query: term 
    ,

但是一旦我点击下拉菜单就会出现这个错误:

Uncaught TypeError: Cannot read property 'length' of undefined - select2 line 1784

如何使用查询词成功过滤结果列表?

【问题讨论】:

【参考方案1】:

来自Select2 documentation 的data 选项:

适用于数组的内置查询函数的选项 [原文如此]。

如果此元素包含一个数组,则数组中的每个元素必须 包含idtext 键。

或者,这个元素可以被指定为一个对象,其中 results 键必须以数组形式包含数据,text 键可以 可以是包含文本的数据项中的键的名称,也可以是 从数组中检索给定数据元素的文本的函数。

这意味着您有两个选择:

(1) 将data 数组更改为具有idtext 属性的对象数组,然后再将其提供给.select2()。然后,您可以摆脱 idformatResultformatSelection 选项。

jQuery.getJSON('/rest/call/to/retrieve/JSON').done(
    function( data ) 

        data = $.map(data, function(item) 
            return  id: item.product, text: item.product ; 
        );

        jQuery('#byProductName').select2(
            placeholder: 'Type any portion of a single product name...',
            allowClear: true,
            minimumInputLength: 0,
            multiple: true,
            data: data
        );
    
);

jsfiddle

(2) 为data 选项提供具有resultstext 属性的对象。在这种情况下,您仍然需要提供 id 选项,但您可以去掉 formatResultformatSelection 选项。

jQuery.getJSON('/rest/call/to/retrieve/JSON').done(
    function( data ) 
        jQuery('#byProductName').select2(
            placeholder: 'Type any portion of a single product name...',
            allowClear: true,
            minimumInputLength: 0,
            multiple: true,
            data:  results: data, text: 'product' ,
            id: function(item)  return item.product; 
        );
    
);

jsfiddle

【讨论】:

感谢 John S. 解决方案 #1 有效,#2 返回 - Uncaught TypeError: Cannot read property 'toUpperCase' of undefined @ select2.js 356 @michaelsaxbury - 我为这两种解决方案添加了 jsfiddle 链接。他们不进行 JSON 调用,但如果返回的数据正确,他们会显示两种解决方案都有效。

以上是关于select2 使用查询词过滤本地 JSON 数据结果的主要内容,如果未能解决你的问题,请参考以下文章

Select2 - 使用 JSON 作为本地数据

Select2 从本地 json 文件加载数据

Select2 Ajax 不匹配结果

select2 search - 只匹配以搜索词开头的词

如何将模型数据加载到在 Yii 中使用 Ajax 过滤的 Select2 下拉列表

Select2 Ajax 不根据查询过滤结果