防止使用 select2 加载数据,直到满足 minlength

Posted

技术标签:

【中文标题】防止使用 select2 加载数据,直到满足 minlength【英文标题】:Prevent loading of data with select2 until minlength is met 【发布时间】:2018-09-06 09:15:28 【问题描述】:

我不确定我是否以正确的方式进行此操作,但如果您有任何建设性的意见可以帮助我朝着正确的方向前进,请分享。我已经被困在这个问题上很长一段时间了。

我有以下 select2 控件,它正在为该表的一个字段加载整个表。 select2 有一个名为 minimumInputLength 的函数,它似乎仍然完整地加载表,而不是查询前三个字符。分页工作正常,如下 fiddle.js 所示:http://jsfiddle.net/jgf5fkfL/66/

$.fn.select2.amd.require(
  ['select2/data/array', 'select2/utils'],
  function (ArrayData, Utils) 
    function CustomData($element, options) 
      CustomData.__super__.constructor.call(this, $element, options);
    

    function contains(str1, str2) 
      return new RegExp(str2, "i").test(str1);
    

    Utils.Extend(CustomData, ArrayData);

    CustomData.prototype.query = function (params, callback) 
      if (!("page" in params)) 
        params.page = 1;
      

      var pageSize = 50;
      var results = this.$element.children().map(function (i, elem) 
        if (contains(elem.innerText, params.term)) 
          return 
            id: [elem.innerText, i].join(""),
            text: elem.innerText
          ;
        
      );

      callback(
        results: results.slice((params.page - 1) * pageSize, params.page * pageSize),
        pagination: 
          more: results.length >= params.page * pageSize
        
      );
    ;

    $(".js-example-basic-multiple").select2(
      ajax: ,
      minimumInputLength: 3,
      allowClear: true,
      width: "element",
      dataAdapter: CustomData
    );
  );

问题是我的观点是在渲染 html 时为活跃的学生加载整个表格。

def multisearch(request):

    userid = ADMirror.objects.filter(student_status_id = 1).values('studentntname').values_list('studentntname', flat=True)

    args = 'userid':userid

    return render(request, 'multisearch.html',args)

我渲染 html 和 select2 控件:

  % block extra_js %
       block.super 
       form.media 
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.js" type="text/javascript"></script>


        <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script>
        <link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet" />
  <script src= "% static '/search/user_select2.js' %" type="text/javascript"></script>

               <div class="col"><h4 style="margin-top: 0"><strong>Student ID Search</strong></h4><select class="js-example-basic-multiple"  value = " userid " style="width: 1110px" required>
               % for user in userid %
               <option value=" user ">  user </option>
               % endfor %
             </select>

现在我知道如何防止在我的过滤器中加载数据,我使用以下方法执行此操作,但我怎样才能让它与我的视图和 select2 的最小输入长度一起工作:

#  doesn't load data on the initial load of the search.html page
    def __init__(self, *args, **kwargs):
        super(StudentFilter, self).__init__(*args, **kwargs)
        # at startup user doen't push Submit button, and QueryDict (in data) is empty
        if self.data == :
            self.queryset = self.queryset.none()

我还尝试了 select2 和 javascript 的以下选项,但未成功,因为数据似乎不可搜索:

$(document).ready(function () 
    $('.js-example-basic-multiple').select2(
      minimumInputLength: 3,
      allowClear: true,
      placeholder: 
        id: -1,
        text: 'Enter the Student id.',
      ,
      ajax: 
        type: 'POST',
        url: '',
        contentType: 'application/json; charset=utf-8',
        async: false,
        dataType: 'json',
        data: function (params) 
            return "'searchFilter':'" + (params.term || '') + "','searchPage':'" + (params.page || 1) + "'";
          ,

        processResults: function (res, params) 
            var jsonData = JSON.parse(res.d);
            params.page = params.page || 1;
            var data =  more: (jsonData[0] != undefined ? jsonData[0].MoreStatus : false), results: [] , i;
            for (i = 0; i < jsonData.length; i++) 
              data.results.push( id: jsonData[i].ID, text: jsonData[i].Value );
            

            return 
              results: data.results,
              pagination:  more: data.more,
              ,
            ;
          ,
      ,
    );

  );

如何才能让我的数据在满足 select2 的最小输入长度之前不加载并且仍然可以搜索?我必须等待整个表加载后才能搜索并返回结果。

【问题讨论】:

【参考方案1】:

回复肯定为时已晚。但万一它帮助别人。我让我这样工作:

$("#select-company").select2(
    ajax: 
        url: "/en/entreprises.json", //URL for searching companies
        dataType: "json",
        delay: 200,
        data: function (params) 
            return 
                search: params.term, //params send to companies controller
            ;
        ,
        processResults: function (data) 
            return 
                results: data
            ;
        ,
        cache: true
    ,
    placeholder: "Start typing",
    minimumInputLength: 3,
);

【讨论】:

【参考方案2】:
$("#selctor").select2(
    placeholder: ".................. choos ....................",
    //dropdownCssClass: 'smalldrop',
    width: '100%',
    ajax: 
        url: "/search RUL",
        dataType: 'json',
        delay: 250,
        data: function (params) 
            return 
                q: params,
                // page: params.page
            ;
        ,
        results: function (data, search) 
            return 
                results: data.items
            ;
        ,
        cache: true
    ,
    templateResult: function (item) 
        if (item.loading) return item.text;
        return item.text;
    ,
    escapeMarkup: function (markup)  return markup; ,
    minimumInputLength: 3,
);

【讨论】:

【参考方案3】:

我认为 minimumInputLength 仅在您尚未加载选项(ajax 加载)时才有效。在您的代码中,选择在开头加载了选项,因此 minimumInputLength 将不起作用。

因此,如果您在页面加载时填充所有选项,minimumInputLength 将不会受到影响。

希望解决方案是这样的。

【讨论】:

所以你是说在 ajax 中加载数据而不是我的选择?你碰巧有类似的例子吗?我认为我与 ajax 一起使用的解决方案应该执行 ajax 加载。 这个小提琴的例子,也是上面应该表现的那样,但搜索永远不会发生,为什么会这样? jsfiddle.net/jgf5fkfL/78。它只是说明正在搜索....但没有返回任何结果。 只是说您可以选择填充在 html 文件中的选项。正如您在此处看到的select2.org/data-sources/ajax html 中的选择必须是这样的&lt;select class="js-data-example-ajax"&gt;&lt;/select&gt; 并且它将在最小数据参数出现时执行搜索。 我认为你的 jsfiddle 没有执行搜索,因为 ajax 调用返回 403(正如你在资源管理器调试器中看到的那样),所以它没有返回任何结果。 我发现 403 对 csfr_token 很宽松,但我仍然无法让它正常工作。我也为它创建了这个线程。 ***.com/questions/49541397/…

以上是关于防止使用 select2 加载数据,直到满足 minlength的主要内容,如果未能解决你的问题,请参考以下文章

select2 如何自定义提示信息

select2使用ajax加载数据无法选择任何选项

Select2 从本地 json 文件加载数据

Select2:如何防止标签排序

jquery Select2 防止在 ajax 响应中选择

如何使用 Laravel 将数据加载到 Select2 中