在 jquery UI 对话框上使用 select2 (v 4.0) 时,如何在使用远程数据源时让 allowClear 选项起作用?

Posted

技术标签:

【中文标题】在 jquery UI 对话框上使用 select2 (v 4.0) 时,如何在使用远程数据源时让 allowClear 选项起作用?【英文标题】:When using select2 (v 4.0) on a jquery UI dialog, how can I get allowClear option to work when using a remote datasource? 【发布时间】:2015-11-19 13:25:44 【问题描述】:

我使用select2 dropdown和刚刚升级到版本4的一个功能,它似乎打破(或我做错了什么)是allowClear选项当你有一个远程数据源和选择2坐拥一个jquery UI对话框强>

它工作正常,如果你的数据源是本地的(没有AJAX),或者如果没有jQuery用户界面对话框参与,但是当我尝试在一个jQuery远程数据源用户界面对话框我看到的问题。

有趣的是,当seetting allowClear = TRUE,则“X” DOES :显示了在下拉框的右侧后,我搜索和选择项目,但是当我点击它,所有选择2码奔跑,但先前选定的值不移除。我已经调试的select2.js代码和所有喜欢它似乎应该被解雇(handleClear等)的代码似乎被正确射击。 P>

当上的本地实例测试,我看到这行代码是实际删除值:

 this.$element.val(this.placeholder.id).trigger('change');

错误时我调试远程数据源上的相同的代码,似乎没有任何变化都当该行代码火灾。 P>

从谷歌上搜索,唯一相关的问题我看看,如果你不指定一个占位符文本(example question here),但对我来说,(按照下文)我做指定此 P>

下面是一些截图:

和这里是我低于代码设置此SELECT2下拉:

asp.net-MVC视图:

 <% = html.DropDownList("MyDropdownId", Model.DropdownItems, new @id = "MyDropdown") %><br/><br/>

和这里是我的javascript

$("#MyDropdown").select2(
    theme: "classic",
    width: "280px",
    allowClear: true,
    ajax: 
        url: "/MyController/Search",
        dataType: 'json',
        delay: 300,
        data: function (params) 
            return  q: params.term ;
        ,
        processResults: function (data, params) 
            return  results: data ;
        ,
        cache: false
    ,
    escapeMarkup: function (markup)  return markup; ,
    minimumInputLength: 3,
    placeholder: "Search",
    templateResult: streamFormatResult,
    templateSelection: streamSelectionResult
);

有没有其他人遇到这个问题,或者可以看到为什么在与远程数据源的选择2下拉菜单中的“X”点击不会清除先前选择的选择吗? P>

更新

下面给出凯文的回答,这个问题似乎是孤立的事实证明我的选择2下拉是一个jQuery UI的对话框(如如果我尝试它正常的网页确实如预期工作的) P>

唯一的其他代码,我不得不添加(以获得选择2在jQuery UI的对话框工作)是这样的代码: P>

if ($.ui && $.ui.dialog && $.ui.dialog.prototype._allowInteraction) 
    var ui_dialog_interaction = $.ui.dialog.prototype._allowInteraction;
    $.ui.dialog.prototype._allowInteraction = function (e) 
        if ($(e.target).closest('.select2-dropdown').length) return true;
        return ui_dialog_interaction.apply(this, arguments);
    ;

如果没有输入SELECT2上面的代码不可编辑。我不知道这是否是引起该问题不清理掉,当我点击“X”以前选择的值。 P>

【问题讨论】:

什么是对#MyDropdown? SPAN>的HTML 你说得对,我抓住了一个错误的问题。尽管如此,HTML,你正在使用的这个问题很重要,因为这将影响占位符的作品。 SPAN> 我补充说我使用在我的视图中的HTML(井的HtmlHelper)跨度> 你有没有尝试初始化选择二后 i>的打开对话框?它将帮助,如果你提供的jQuery UI代码和HTML SPAN> 【参考方案1】:

使用单选占位符时,您必须始终为其提供&lt;option&gt;&lt;/option&gt;,即使您使用的是远程数据源。这是因为 Select2 需要一个值来将选择设置为(通常是一个空白字符串),并且它可以做到这一点的唯一方法是使用占位符选项。

如果您可以访问 HTML,简单的解决方案是在 &lt;select&gt; 内添加一个空白 &lt;option&gt;

<select>
  <option></option>
</option>

您甚至可以在其中添加一些有用的文本以显示给用户,value 只需为空字符串

<select>
  <option value="">Select an option</option>
</select>

现在,一些框架会自动为您生成&lt;select&gt;。幸运的是,其中大多数都提供了一种为您定义“空白”或“占位符”选项的方法。如果由于某种原因框架没有,您通常可以在您告诉框架呈现的选项列表中添加一个新选项。

对于 ASP.NET MVC,您需要通过传入 another argument to Html.DropDownList 来控制占位符选项。

<% = Html.DropDownList("MyDropdownId", Model.DropdownItems, "Select an option", new @id = "MyDropdown") %>

这应该会在选项列表的顶部生成一个空白占位符。

现在,一些框架将要求占位符选项有一个value,而不是一个空白字符串。 Select2 支持通过传入数据对象而不是 placeholder 的字符串来设置自定义占位符 value

所以对于看起来像这样的 HTML

<select>
  <option value="-1">Select an option</option>
</select>

您将使用placeholder 的以下代码初始化 Select2

$('select').select2(
  placeholder: 
    id: '-1',
    text: 'Custom placeholder text'
  
);

这是一个使用placeholderallowClear 的远程数据源(在本例中为模拟)示例。请记住,您不需要设置 ajax.transport,这只是因为我们实际上并没有发出远程请求。

$('.js-states').select2(
  placeholder: 
    id: "-1",
    text: "Select a state..."
  ,
  allowClear: true,
  ajax: 
    url: "/MyController/Search",
    dataType: 'json',
    delay: 300,
    data: function (params) 
      return  q: params.term ;
    ,
    processResults: function (data, params) 
      return  results: data ;
    ,
    cache: false,
    transport: function (params, success, failure) 
      var term = params.data.q || "";
      
      // mock response
      var response = [
        
          id: "AK",
          text: "Alaska"
        ,
        
          id: "AL",
          text: "Alabama"
        ,
        
          id: "AZ",
          text: "Arizona"
        ,
        
          id: term || "nothing",
          text: term || ""
        
      ];
      
      success(response);
    
  
);
<link href="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/css/select2.css" rel="stylesheet"/>

<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/js/select2.js"></script>

<select class="js-states" style="width: 50%">
  <option value="-1">Select a state</option>
</select>

【讨论】:

你有这个工作的例子吗,因为我已经做了一个改变,得到你所拥有的,我仍然没有看到任何不同(点击 X 仍然没有清除值)。一个有趣的注意事项是,即使您添加 ,它也会在您初始化后被 select2 删除 当值设置为-1 并触发change 事件时,您是否仍然没有看到任何变化? $('select').val() 显示了什么? 是的。 Select.val 显示我要删除的值 您提到该选项正在被删除。你的意思是从标记还是从结果? Select2 不应该自行删除任何内容,所以我不确定它为什么会从标记中消失。 是的,当我在 select2 初始化后查看源代码时,它会从原始 select 中删除该项目。 .你有没有看过我要求的工作或有任何示例代码,因为这会很有帮助?

以上是关于在 jquery UI 对话框上使用 select2 (v 4.0) 时,如何在使用远程数据源时让 allowClear 选项起作用?的主要内容,如果未能解决你的问题,请参考以下文章

Select2 适用于宽度较小的@Html.DropDownList Jquery UI 对话框?

jQuery-ui 对话框不显示在点击事件上

如何在iframe外部的父窗口上显示Jquery UI对话框

jQuery UI 对话框上的按钮是不是必须去抖动?

在 <Enter> 上提交 jQuery UI 对话框

使用 jQuery-ui 对话框的 Knockout 组件忽略绑定