【问题标题】:Set data of a Multiple Select2 element through javascript通过javascript设置Multiple Select2元素的数据
【发布时间】:2017-11-10 01:27:32
【问题描述】:

我正在通过 Javascript、ajax 和 jquery 将多个值加载到 Select2 元素中。虽然数据加载正确并且加载后可以访问,但我无法在 Select2 元素中设置存储的数据。

编辑:我正在使用 Select2 v3.5。

我的代码:

HTML:

<input class="jsData" style="width: 100%"  id="select2Data"></input>

Javascript:

 $(".jsData").select2({
                        ajax: {
                            minimumInputLength: 4,
                            contentType: 'application/json',
                            url: '<%=Url.Action("GetData","Controller")%>',
                            type: 'POST',
                            dataType: 'json',
                            data: function (term) {
                                return {
                                    sSearchTerm: term
                                };
                            },
                            results: function (data) {
                                return {
                                    results: $.map(JSON.parse(data), function (item) {
                                        return {
                                            text: item.term,
                                            slug: item.slug,
                                            id: item.Id
                                        }
                                    })
                                };
                            }
                        },
                        multiple: true
                    });

因此,这将创建一个 Select2 元素,我可以在其中遍历数据库并根据我输入的内容加载数据。我还可以使用以下行访问数据(由用户输入):

$('.jsData').select2('val')

以上行返回一个数组,我可以将它存储在数据库中。我当前的目标是将存储的数据设置回 Select2 元素中。非常欢迎在这件事上提供任何帮助。

更新:我想要完成的相关链接: https://select2.github.io/examples.html#programmatic

我想要在 Select2 中设置多个元素的示例。但是,不同之处在于,Select2 文档中的示例在加载页面时会带来数据,而我将前往获取数据。

【问题讨论】:

  • 在 Select2 文档中,它看起来像道具是 processResults 而不是 results 就像您在示例代码中显示的那样。
  • 我正在使用 Select2 v3.5,其中使用了 results。据我所知,processResults用于v4.0及以上版本。
  • 我能够使用 v3.5.4 和不同的数据源使其工作。您能否验证您的数据源是否正在返回数据?
  • 问题在于 设置 Select2 元素的值。我能够对控制器进行连续的 ajax 访问,并根据用户输入的内容检索数据,这不是问题。但是,我正在尝试 set Select2 元素中的数据。 (续) 基本上:如果我输入了一些数据,我可以访问输入数据的数组,并将其存储在数据库中。我现在的目标是从数据库中获取数据并将其加载回 Select2 元素中,以供用户将来修改。
  • 以下解决方案已更新以显示如何设置值。

标签: javascript asp.net-ajax jquery-select2


【解决方案1】:

Select2 v3.5.4 docs 对此有点困惑。我认为文档中存在误导性的错字。

首先,请注意,当我从远程源检索数据时,我将其作为{id: ##, name: NAME} 格式的对象返回。

第一步是添加initSelection参数并传递函数来检索之前选择的项目。

下一步,我认为有一个错字,是定义formatSelection 参数(不是它在文档中声明的formatResult)。此函数定义如何显示先前选择的结果。在这种情况下,我只是显示结果的name 属性。

formatResult 参数定义了如何显示新选择的选项。你会注意到formatResultformatSelection 在下面是相同的。我本可以重用一个函数,但觉得这更适合演示。

$(document).ready(function() {
  function formatResult(data) {
    return data.name;
  };

  function formatSelection(data) {
    return data.name; 
  }

  $(".jsData").select2({
    ajax: {
      minimumInputLength: 4,
      url: "https://jsonplaceholder.typicode.com/users",
      type: "GET",
      dataType: "json",
      results: function(data) {
        return {
          results: $.map(data, function(user) {
            return {
              name: user.name,
              id: user.id
            };
          })
        };
      }
    },
    initSelection: function(element, callback) {
      var id = $(element).val();
      if (id !== "") {
        $.ajax("https://jsonplaceholder.typicode.com/users/" + id, {
          dataType: "json"
        }).done(function(data) {
          callback(data);
        });
      }
    },
    formatResult: formatResult,
    formatSelection: formatSelection,
    multiple: true
  });
});

这是完整的工作示例:

$(document).ready(function() {
  function formatResult(data) {
    return data.name;
  };
  
  function formatSelection(data) {
    return data.name; 
  }

  $(".jsData").select2({
    ajax: {
      minimumInputLength: 4,
      url: "https://jsonplaceholder.typicode.com/users",
      type: "GET",
      dataType: "json",
      results: function(data) {
        return {
          results: $.map(data, function(user) {
            return {
              name: user.name,
              id: user.id
            };
          })
        };
      }
    },
    initSelection: function(element, callback) {
      var id = $(element).val();
      if (id !== "") {
        $.ajax("https://jsonplaceholder.typicode.com/users/" + id, {
          dataType: "json"
        }).done(function(data) {
          callback(data);
        });
      }
    },
    formatResult: formatResult,
    formatSelection: formatSelection,
    multiple: true
  });
});
.jsData {
  width: 200px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/3.5.4/select2.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/3.5.4/select2.css" rel="stylesheet"/>

<input class="jsData" style="width: 100%"  id="select2Data" value="10"></input>

【讨论】:

  • 谢谢!我将对其进行测试,但浏览一下我认为 initSelection 位应该可以解决问题。
  • 更新 原来,解决方案实际上比我想象的要简单!我所做的只是:将 Value 和 Text 分别存储在数据库中,并将它们分配给 Select2 的 data 部分,而不是 。像魅力一样工作!
  • 不错。我想如果所选值及其相关数据不改变,这将起作用。
猜你喜欢
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
  • 2018-07-29
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
相关资源
最近更新 更多