【问题标题】:Select2 default options with ajax使用 ajax 选择 2 默认选项
【发布时间】:2016-01-09 21:49:37
【问题描述】:

我有下一个 html 结构

<select class="change_item_dropdown_ajax form-control" id="item_id" name="item_id" onchange="updateData(this, this.value, 16)" >
<optgroup label="System Data">
  <option value="17">Test</option>
  <option selected="selected" value="18">System</option>
</optgroup>
</select>

Javascript

 $(".change_item_dropdown_ajax").select2({
        ajax: {
            url: "get_user_items",
            dataType: 'json',
            delay: 250,
            theme: "classic",
            data: function (params) {
                return {
                    q: { name_contains: params.term } // search term
                };
            },
            processResults: function (data) {
                return {
                    results: data
                };
            },
            cache: true
        },
        allowClear: true,
        placeholder: '--- Please select item ---',
        minimumInputLength: 1
    });

我想让客户有可能看到带有项目&lt;optgroup label="System Data"&gt; 的一些默认系统选项,而且还增加了通过他自己的项目进行搜索 ajax 查询的能力。

但是在绑定 select2 后它不显示&lt;optgroup label="System Data"&gt;...&lt;/optgroup&gt;

select2 选项为空,仅显示提示“请输入 1 个或多个字符”。

目前还不清楚是否可以,谢谢。

UPDselect2 removes default options when using ajax相关

Select-2 在使用 ajax 适配器时删除选项。

UPD2 github问题https://github.com/select2/select2/issues/3828

【问题讨论】:

  • 所以,您基本上希望拥有一个始终可见的 optgroup,无论客户端搜索什么,在此之下,在另一个 optgroup 中,您想查看搜索结果吗?
  • 只有当输入中没有文本时,用户才会在搜索输入下的下拉菜单中看到默认值

标签: jquery-select2 jquery-select2-4


【解决方案1】:

在这种情况下,可能(不幸的是,我认为唯一的)解决方案是编写自定义适配器。 像这样的:

$.fn.select2.amd.define('select2/data/extended-ajax',['./ajax','../utils','jquery'], function(AjaxAdapter, Utils, $){

  function ExtendedAjaxAdapter ($element,options) {
    //we need explicitly process minimumInputLength value 
    //to decide should we use AjaxAdapter or return defaultResults,
    //so it is impossible to use MinimumLength decorator here
    this.minimumInputLength = options.get('minimumInputLength');
    this.defaultResults     = options.get('defaultResults');

    ExtendedAjaxAdapter.__super__.constructor.call(this,$element,options);
  }

  Utils.Extend(ExtendedAjaxAdapter,AjaxAdapter);

  //override original query function to support default results
  var originQuery = AjaxAdapter.prototype.query;

  ExtendedAjaxAdapter.prototype.query = function (params, callback) {
    var defaultResults = (typeof this.defaultResults == 'function') ? this.defaultResults.call(this) : this.defaultResults;
    if (defaultResults && defaultResults.length && (!params.term || params.term.length < this.minimumInputLength)){
      var processedResults = this.processResults(defaultResults,params.term);
      callback(processedResults);
    }
    else {
      originQuery.call(this, params, callback);
    }
  };

  return ExtendedAjaxAdapter;
});

https://gist.github.com/govorov/3ee75f54170735153349b0a430581195

此适配器首先分析查询词。如果 term 长于 minimumInputValue,AjaxAdapter 将被启动。否则,defaultResults 将被传递给回调。

要使用此适配器,只需将其传递给 select2 选项:

dataAdapter: $.fn.select2.amd.require('select2/data/extended-ajax')

我没有使用 requireJS 或 AMD,如果使用,请使用它来 require 适配器。

【讨论】:

    【解决方案2】:

    如果您想拥有一个始终可见的&lt;optgroup&gt;,无论客户端搜索什么,在此之下,在另一个&lt;optgroup&gt; 中,您想查看搜索结果,试试这个:

    在您的服务器端脚本中,您正在处理客户端输入的搜索查询,您应该返回一个 json_encoded array,其中包含您希望在选择框中显示的项目。而不是这个,尝试做这样的事情:

    ** 根据您在问题评论中的要求修改的代码**

    $q=$_REQUEST['q']; //the query string passed, note, that if you have minimumInputLength set, until that inputLength is reached, this part of the code won't run, so if you require the minimumInputLength, you should play with the templateResult option of select2
    if (empty($q)) {
       $results=array();
       $result[0]=array(); //an optgroup to display when no query was sent
       $result[0]['text']='System Data';
       $result[0]['children']=array();
       // populate your first optgroup here, using the format which you are sending to select2.
    } else {    
       $result[0]=array(); //an optgroup for results for the users searches
       $result[0]['text']='User results';
       $result[0]['children']=array();
       //populate the children array with the search related results
    }
    
    // json_encode the $result array, and return it
    

    我正在使用一个类似的代码,它在我身边完美无缺,但可能需要设置一些其他的东西才能工作(我几个月前编写了代码,我记得我有很难弄清楚),如果这种方法不起作用,请通知我,我会查看我的代码,看看我是如何做到的。

    【讨论】:

    • 亚当,这不是服务器端的问题,用户应该在搜索之前看到默认数据。
    • 使用此解决方案,用户确实会看到默认数据,我不知道还有其他解决方案。如果您只想在搜索输入为空时显示默认数据,只需在查询为空时返回该数据服务器端。每次进行新搜索时,Select2 都会重建 &lt;select&gt; 元素的 html,因此,如果您想要一直存在的内容,则必须处理该服务器端。
    • 亚当,当用户没有输入文本时,也不会对服务器端进行查询,再次使用客户端修复它
    • 我有这个问题,因为 ajax 适配器从 select2 初始化过程中的选择中删除了现有选项,这不应该发生
    • @Fivell,不执行查询,因为您设置在查询之前至少应输入 1 个字符。如果在设置select的时候去掉minimumInputLength参数,或者设置为0,这样就可以了。以这种方式单击选择框时,您每次将进行 1 次额外查询,但会达到预期的结果。如果您需要 minimumInputLength 1 来减少查询,那么获得所需结果的唯一方法是使用一种“hack”,并使用“templateResult”参数函数。
    猜你喜欢
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    • 2012-02-27
    • 1970-01-01
    相关资源
    最近更新 更多