如何在 select2 类型提前搜索中设置选项值以及如何从 ajax 数据添加选项组

Posted

技术标签:

【中文标题】如何在 select2 类型提前搜索中设置选项值以及如何从 ajax 数据添加选项组【英文标题】:How to set option value in select2 type ahead search AND how to add an option group from ajax data 【发布时间】:2014-10-10 07:47:08 【问题描述】:

我正在使用 select2 对几种不同类型的数据创建一种元搜索,我试图弄清楚如何:

    明确设置select选项的值(我需要设置成json字符串) 如何从远程数据动态创建选项组

所以我有 select2 调用:

var meta_ajaxUrl = '[[~45]]?search_what=metaSearch';// modx url

$('#metasearch').select2(  
    placeholder: "Search for anything!",
    minimumInputLength: 3,
  ajax: 
    url: meta_ajaxUrl,
    dataType: 'json',
    data: function (term, page) 
      return 
        q2: term
      ;
    ,
    results: function (data, page) 
    console.log(data);
      return  results: data ;
    
  ,
  formatResult: metaFormatResult,
);

以及我的 php 中返回的数组之一的示例

$options = $this->modx->getCollectionGraph('FundRequest', ' ', $criteria);

foreach($options as $option)
    $push = array(
        'id' => array('type' => 'tipa', 'value' => $option->get('id')),
        'name' => $option->Client->get('first_name'),
        'program' => $option->Program->ProgramName->get('name'),
        'location' => $option->Program->Location->get('location'),
        'cams' => $option->get('cams'),
        'text' => $option->Program->ProgramName->get('name'),
    );


array_push($output, $push);


// these get serialized and returned
return $this->modx->toJSON($output);

当输出被序列化时,它看起来像:

"id":"type":"person","value":77,"name":"Foo Bar","cams":1234567,"text":"Foo Bar"

所以,当 select2 为选择控件取值时,它会尝试使用 id 作为 value 属性。如果我查看源代码,我会看到如下内容:

不知何故,我需要告诉 select2 id 的值是 '"type":"person","value":77' 有谁知道如何做到这一点?

此外,搜索搜索三种不同类型的信息,如果能够将它们分类到选项组中,那就太好了。有谁知道如何在 select2 结果中动态插入选项组?

【问题讨论】:

【参考方案1】:

对于第一个问题,您可以调整 formatResult 函数,以便 id 将自身转换为 json 字符串。在我的回复中,我使用一个辅助函数来测试 id 是否已经是一个 json 字符串(它将在第一次转换之后)。

对于第二个问题,您可以使用children 选项(搜索Example Hierarchical Data in the docs)。

我使用了静态数据,但只要您提供与给定示例匹配的 json 对象,它就应该适用于 ajax 数据。

您可以在this jsfiddle 中查看工作演示。

<form method="post" id="myForm">
    <input type="hidden" id="metasearch" style="width: 300px" />
</form>

<script>
$(document).ready(function() 
    $("#metasearch").select2(
        data: [
        
            text    : 'Persons', 
            children: [
            
                "id": "type":"person","value":77, "name":"Foo Bar", "cams":1234567, "text":"Foo Bar"
            ,
            
                "id": "type":"person","value":78, "name":"Bar", "cams":3, "text":"Bar"
            ,
            
                "id": "type":"person","value":79, "name":"Yupi kay", "cams":127, "text":"Yupi kay"
            
            ]
        ,
        
            text    : 'Cars',
            children: [
            
                "id": "type":"car","value":1, "name":"Super", "cams":1, "text":"Super"
            ,
            
                "id": "type":"car","value":2, "name":"Sport", "cams":2, "text":"Sport"
            ,
            
                "id": "type":"car","value":3, "name":"Exec", "cams":3, "text":"Exec"
            
            ]
        
        ],
        formatResult: function(result) 
            if ( ! isJsonString(result.id))
                result.id = JSON.stringify(result.id);

            return result.text;
        
    );

    function isJsonString(str) 
        try 
            JSON.parse(str);
         catch (e) 
            return false;
        
        return true;
    
);
</script>

【讨论】:

以上是关于如何在 select2 类型提前搜索中设置选项值以及如何从 ajax 数据添加选项组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JavaScript 中设置多个值以列出值

如何使用 JSON 在 select2 中设置 optgroup

如何在 select2 yii2 中设置选定值或默认值?

如何使用 asp.net mvc 中的标记在 Select2 输入中设置默认值

在 4.0.3 js 中使用远程源时如何在 Select2 中设置值

yii2 - 如何在 javascript 中设置 kartik select2 值