【问题标题】:Display Select2 value not in list显示 Select2 值不在列表中
【发布时间】:2016-11-17 02:42:16
【问题描述】:

虽然可以使用 createSearchChoice 将新值添加到 Select2 (3.5) 元素中,但如果新值不在列表中,我如何才能获得要显示的新值?我可以添加不在 Select2 列表中的值,但是如何显示不在列表中的默认值?

$("#select").select2({
    placeholder: "Who is the invoice from?",
    minimumInputLength: 2,
    quietMillis: 300,
    allowClear : true,
    ajax: {
        url: "accountsDataStore.xsp",
        dataType: 'json',
        data: function (term, page) {
            return {
                q: term, // search term
                page_limit: 10
            };
        },
        results: function (data, page) { return data; }
    },

    // extra code to allow entering value not in list
    id: function(object) { return object.text; },

    //Allow manually entered text in drop down.
    createSearchChoice:function(term, data) {
                        if ( $(data).filter( function() {
                                  return this.text.localeCompare(term)===0;
                              }).length===0) {
                                      return {id:term, text:term};
                        }
    },

    initSelection: function(element, callback) {
                        //sets a default value (if a value was selected previously)
                        //get the existing value
                        var id = $(element).val();

                        //if a value was selected: perform an Ajax call to retrieve the text label      
                        if (id !== "") {
                            $.ajax( 
                                "accountsDataStore.xsp", {
                                    data: { id: id },
                                    dataType: "json"
                                }).done(function(data) { 
                                       // ** TODO if value not found, display current element value -- HOW??  **
                                       callback(data); });
                        }
                    }

    }).on('change', function (evt) {
                              // Do something after value changes
                              }
);

initSelection期间,如果没有找到默认值,那么如何显示当前值?

<input type="hidden" 
       id="view:_id1:_id4:callback1:inputName" 
       name="view:_id1:_id4:callback1:inputName" 
       aria-required="true" 
       value="ACME Company" 
       tabindex="-1" 
       class="select2-offscreen">

在表单中,设置了值,它只是不显示在出现选定值的&lt;span&gt; 中。我们只是以某种方式将其添加到列表中吗?

谢谢。

【问题讨论】:

    标签: twitter-bootstrap xpages select2


    【解决方案1】:

    我个人通过正确使用视图控制器(viewScoped bean)来处理允许不在列表中的值的 select2 元素。

    使用以下代码,我做了 3 件事:

    <xp:comboBox id="comboDemo" value="#{ctrl.comboValue}" validator="#{ctrl.validateCombo}">
       <xp:selectItems value="#{ctrl.comboChoices}" />
     </xp:comboBox>
    
    1. 我绑定了组合的值
    2. 我确保在客户端创建和选择的任何新选项都被接受
    3. 我为组合框加载默认选项

    默认选项是根据当前绑定值构建的,除非它是 null

    public List<SelectItem> getComboChoices() {
        if (comboChoices == null) {
            comboChoices = new ArrayList<SelectItem>();
    
            // Complete with your own logic here
            if (StringUtil.isNotEmpty(comboValue)) {
                comboChoices.add(new SelectItem(comboValue, comboValue));
            }
        }
    
        return comboChoices;
    }
    

    一旦选择了一个新值,我需要确保它会在返回服务器的过程中被接受。我利用验证阶段潜入新值。

    public void validateCombo(FacesContext facesContext, UIComponent component, Object value) {
        boolean isNewValue = true;
    
        for (SelectItem item : comboChoices) {
            if (value.equals(item.getValue())) {
                isNewValue = false;
                break;
            }
        }
    
        if (isNewValue) {
            String newValue = (String) value;
            comboChoices.add(new SelectItem(newValue, newValue));
        }
    }
    

    以上是我所做的简化版本。你可以让它更聪明,但我希望这个例子足够清楚。

    【讨论】:

      【解决方案2】:

      动态选项创建

      除了预先填充的选项菜单外,Select2 还可以动态地 从用户在搜索框中输入的文本创建新选项。这 功能称为“标记”。要启用标记,请将 tags 选项设置为 真的:

      查看here了解详细信息

      在 select2 中,您打算做的事情称为标记,这是怎么回事;

      <select class="form-control">
        <option selected="selected">orange</option>
        <option>white</option>
        <option>purple</option>
      </select>
      
      //the major ish
      $(".js-example-tags").select2({
        tags: true
      });
      

      简单地说,只需在 select2 初始化期间设置标签,您就可以选择添加不在下拉列表中的值。

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-23
        • 2013-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多