从 select2 中的选定选项中获取 optGroup id

Bra*_*ane 4 jquery json jquery-select2

我怎样才能idoptgroup在选择子元素?例如,如果您使用这种 JSON 来创建select2

var data = [{ 
    id: p0, 
    text: 'enhancement',
    children: [{
        id: c5,
        text: 'enhancement child1'
    },{
        id: c6,
        text: 'enhancement child2'
    }]
},{ 
    id: c1, 
    text: 'bug' 
},{ 
    id: c2, 
    text: 'duplicate' 
},{ 
    id: c3, 
    text: 'invalid' 
},{ 
    id: c4, 
    text: 'wontfix' 
}];
Run Code Online (Sandbox Code Playgroud)

并且 using$("#select2").val();只会从选定项目中检索 id,那么optgroups可以通过哪种方式检索所有父id?(对于所选enhancement child1项目,返回的数据是id=c5id=p0

提琴手

任何建议和方向如何解决这个问题?

Twi*_*sty 7

根据我的研究,optgroup在进行选择时没有直接收集id 的方法。这是生成的 HTML:

<select class="js-example-data-array select2-hidden-accessible" tabindex="-1" aria-hidden="true">    
    <optgroup label="enhancement">
        <option value="c5">enhancement child1</option>
        <option value="c6">enhancement child2</option>
    </optgroup>
    <option value="c1">bug</option>
    <option value="c2">duplicate</option>
    <option value="c3">invalid</option>
    <option value="c4">wontfix</option>
</select>
Run Code Online (Sandbox Code Playgroud)

编辑

经进一步检查,DOM对html body.forceShow select.js-example-data-array.select2-hidden-accessible optgroup确实有一个valuep0。仍在尝试根据特定选择找出如何收集此信息。

您可以将此详细信息添加到数据中,然后将其取出。示例:https : //jsfiddle.net/Twisty/rfn5p18x/4/

HTML

<select class="js-example-data-array">
</select>
<select class="js-example-data-array-selected">
  <option value="2" selected="selected">duplicate</option>
</select>
<div id="results">
</div>
Run Code Online (Sandbox Code Playgroud)

查询

var data = [{
  id: 'p0',
  text: 'enhancement',
  children: [{
    id: 'c5',
    text: 'enhancement child1',
    parent: 'p0'
  }, {
    id: 'c6',
    text: 'enhancement child2',
    parent: 'p0'
  }]
}, {
  id: 'c1',
  text: 'bug'
}, {
  id: 'c2',
  text: 'duplicate'
}, {
  id: 'c3',
  text: 'invalid'
}, {
  id: 'c4',
  text: 'wontfix'
}];

$(document).ready(function() {
  $(".js-example-data-array").select2({
    data: data
  });
  $(".js-example-data-array").on("select2:select", function(e) {
    if (e.params.data.parent.length) {
      console.log(e.params.data.parent + " > " + e.params.data.id + " selected");
    } else {
      console.log(e.params.data.id + " selected");
    }
  });
  $(".js-example-data-array-selected").select2({
    data: data
  });
});
Run Code Online (Sandbox Code Playgroud)

您现在可以看到数据包含对父项的引用,现在可以在选择选项时访问。它将不可用,.val()但您可以在选择时将其存放在其他地方或修改.val()以包含它。

编辑固定

能够optgroup$("option:selected").parent("optgroup").val();. 工作示例:https : //jsfiddle.net/Twisty/rfn5p18x/7/

查询

var data = [{
  id: 'p0',
  text: 'enhancement',
  children: [{
    id: 'c5',
    text: 'enhancement child1',
  }, {
    id: 'c6',
    text: 'enhancement child2',
  }]
}, {
  id: 'c1',
  text: 'bug'
}, {
  id: 'c2',
  text: 'duplicate'
}, {
  id: 'c3',
  text: 'invalid'
}, {
  id: 'c4',
  text: 'wontfix'
}];

$(document).ready(function() {
  $(".js-example-data-array").select2({
    data: data
  });
  $(".js-example-data-array").on("select2:select", function(e) {
    var pID = $("option:selected").parent("optgroup").val();
    if (typeof pID !== "undefined") {
      $("#results").append("Parent: " + pID + "<br />\r\n");
    }
    $("#results").append("Value: " + $(this).val() + "<br />\r\n");
  });

  $(".js-example-data-array-selected").select2({
    data: data
  });
});
Run Code Online (Sandbox Code Playgroud)