Pregunta Muestra el resultado opting group matching usando select2


Estoy usando select2 con Bootstrap 3. Ahora me gustaría saber si es posible mostrar todos los elementos del grupo optgroup si la búsqueda coincide con el nombre del grupo optg mientras aún se pueden buscar elementos. Si esto es posible, ¿cómo puedo hacerlo?


6
2018-02-24 16:02


origen


Respuestas:


En realidad encontró la solución modificando el matcher opt

 $("#myselect").select2({
    matcher: function(term, text, opt){
         return text.toUpperCase().indexOf(term.toUpperCase())>=0 || opt.parent("optgroup").attr("label").toUpperCase().indexOf(term.toUpperCase())>=0
    }
});

Bajo la premisa de que el atributo de etiqueta se ha establecido en cada grupo de opción.


18
2018-02-24 19:12



Las respuestas anteriores no parecen funcionar de la caja con Select2 4.0, así que si estás buscando eso, mira esto: https://github.com/select2/select2/issues/3034

(Usa la función de esta manera: $("#example").select2({matcher: modelMatcher});)

function modelMatcher (params, data) {
  data.parentText = data.parentText || "";

  // Always return the object if there is nothing to compare
  if ($.trim(params.term) === '') {
    return data;
  }

  // Do a recursive check for options with children
  if (data.children && data.children.length > 0) {
    // Clone the data object if there are children
    // This is required as we modify the object to remove any non-matches
    var match = $.extend(true, {}, data);

    // Check each child of the option
    for (var c = data.children.length - 1; c >= 0; c--) {
      var child = data.children[c];
      child.parentText += data.parentText + " " + data.text;

      var matches = modelMatcher(params, child);

      // If there wasn't a match, remove the object in the array
      if (matches == null) {
        match.children.splice(c, 1);
      }
    }

    // If any children matched, return the new object
    if (match.children.length > 0) {
      return match;
    }

    // If there were no matching children, check just the plain object
    return modelMatcher(params, match);
  }

  // If the typed-in term matches the text of this term, or the text from any
  // parent term, then it's a match.
  var original = (data.parentText + ' ' + data.text).toUpperCase();
  var term = params.term.toUpperCase();


  // Check if the text contains the term
  if (original.indexOf(term) > -1) {
    return data;
  }

  // If it doesn't contain the term, don't return anything
  return null;
}

13
2017-08-18 23:24



Unos pocos cambios menores a las personas sugirieron un código, menos repetitivo y se adapta cuando no hay grupos opcionales principales:

$('select').select2({
    matcher: function(term, text, opt){
        var matcher = opt.parent('select').select2.defaults.matcher;                        
        return matcher(term, text) || (opt.parent('optgroup').length && matcher(term, opt.parent('optgroup').attr("label"))); 
    }
});

0
2017-07-21 23:50