1

我想用 select2(4.0.0) 和 jquery(2.1.4) 实现以下场景:

  • 我有一个从外部源获取数据的选择框(Java 应用程序服务器上的端点)
  • 用户可以选择返回的值之一或提出自己的值
  • 现在,当用户提交表单并且服务器端的验证失败时,我想显示用户之前提供的所有值的表单,因此选择框应该将值发送到服务器。

为了实现这一点

  • 我使用ajax from select 从服务器查询数据
  • 我使用createTag允许用户创建自己的值
  • 我想使用initSelection用用户先前添加的值预填充选择框。

我的代码如下所示:

$("select[name='serie']").select2({
    ajax: {
        url: "http://javaendpoit/serie/filter",
        dataType: 'json',
        delay: 250,
        data: function (params) {
          return {
            name: params.term,
            page: params.page
          };
        },
        processResults: function (data, page) {
          return {
            results: $.map(data, function (item) {
              return {
                text: item.name,
                name: item.name,
                id: item.name
              }
            })
          };
        },
        cache: true
      },
      escapeMarkup: function (markup) { return markup; },
      minimumInputLength: 2,
      templateResult: formatRepo,
      templateSelection: formatRepoSelection,
      tags: true,
      createTag: function (tag) {
        return {
          id: tag.term,
          text: tag.term,
          name: tag.term,
          isNew : true
        };
      },
      /* below part is rendered by jsp so that it has the value from previous form submission; if it is initial form render the below part is not included */
      initSelection : function (element, callback) {
            callback({id:"Name",name:"Name","text":"Name"});
      }   
    });

 function formatRepo (serie) {
        if (serie.loading) return serie.text;
        var markup = '<div class="clearfix">' +
        '<div clas="col-sm-10">' +
        '<div class="clearfix">' +
        '<div class="col-xs-12">' + serie.name + '</div>' +
        '</div>';
        markup += '</div></div>';
        return markup;
  }

  function formatRepoSelection (serie) {
    return serie.name;
  }

这工作得很好。这意味着提交后我可以在选择框中看到值名称,它是选定的值。不过,如果我再次尝试提交此表单,请求中将缺少该值。

正如这里的主题数量所建议的那样,我添加了以下行(见最后一行)。

  /* [...] */
  initSelection : function (element, callback) {
        callback({id:"Name",name:"Name","text":"Name"});
  }   
}).select2("val","Name");

但是在添加这个之后,值Name在 select2 框中甚至不可见。

我已经尝试修复它几个小时了,但不知何故找不到正确的解决方案。我敢打赌我错过了一些基本的东西。请帮忙!

- - [编辑]

添加数据后,即使使用val设置值,我也可以看到值 Name,但如果我重新提交表单,请求中仍然不存在该值。

.select2('data',{id:"Name",name:"Name","text":"Name"})
.select2('val', "Name")

--- [编辑 2]

在 html 中,我使用select来创建这个元素。

<select class="form-control" name="serie"></select>
4

2 回答 2

3

我设法使用 select2 版本 4.0.2 做到这一点,如下所示:

$("select[name='serie']").data('select2')
    .dataAdapter.select({
        id:"Name",
        name:"Name",
        "text":"Name"
    });
于 2016-05-12T09:36:07.843 回答
2

感谢凯文,我能够解决这个难题。所以最终我放弃了使用initSelection。相反,我只是用应该选择的选项填充了选择标签。

<select class="form-control" id="author" name="author" multiple="multiple">
  <option value="name" selected="selected">name</option>
</select>

从 select2 定义中删除了 initSelection

$("select[name='author']").select2({
    ajax: {
        url: "http://javaendpoit/serie/filter",
        dataType: 'json',
        delay: 250,
        data: function (params) {
            return {
                name: params.term,
                page: params.page
            };
        },
        processResults: function (data, page) {
            return {
                results: $.map(data, function (item) {
                    return {
                        text: item.name,
                        name: item.name,
                        id: item.name
                    }
                })
            };
        },
        cache: true
    },
    escapeMarkup: function (markup) {
        return markup;
    },
    minimumInputLength: 1,
    templateResult: formatRepo,
    templateSelection: formatRepoSelection,
    tags: true,
    createTag: function (tag) {
        return {
            id: tag.term,
            text: tag.term,
            name: tag.term,
            isNew: true
        };
    }
});

并更改了 formatRepoSelection 以使用没有名称属性的值。

function formatRepoSelection(serie) {
    if (serie.name === undefined) {
        return serie.text;
    } else {
        return serie.name;
    }
}

我想我不能在formatRepo中使用name属性,并且可以删除 formatRepoSelection 的 if子句。但这只是一个小问题。

于 2015-06-15T14:34:56.567 回答