2012-05-09 10 views
7

Estoy implementando el autocompletado de jQuery UI basado en el ejemplo de categorías en la documentación. Me gustaría agregar el número de resultados al encabezado Categorías, así que en lugar de mostrar "Productos", muestra "Productos (3)". Sé que la función _renderMenu debe modificarse a partir del ejemplo, pero tengo problemas para entender cómo se puede modificar. Cualquier ayuda que me inicie por el camino correcto sería muy apreciada.jQuery UI Categorías de autocompletado con mecanismo de conteo

Aquí está el código de ejemplo de interfaz de usuario jQuery Autocompletar Categorías de Evaluación:

<script> 
    $.widget("custom.catcomplete", $.ui.autocomplete, { 
     _renderMenu: function(ul, items) { 
      var self = this, 
       currentCategory = ""; 
      $.each(items, function(index, item) { 
       if (item.category != currentCategory) { 
        ul.append("<li class='ui-autocomplete-category'>" + item.category + "</li>"); 
        currentCategory = item.category; 
       } 
       self._renderItem(ul, item); 
      }); 
     } 
    }); 
    </script> 
    <script> 
    $(function() { 
     var data = [ 
      { label: "anders", category: "" }, 
      { label: "andreas", category: "" }, 
      { label: "antal", category: "" }, 
      { label: "annhhx10", category: "Products" }, 
      { label: "annk K12", category: "Products" }, 
      { label: "annttop C13", category: "Products" }, 
      { label: "anders andersson", category: "People" }, 
      { label: "andreas andersson", category: "People" }, 
      { label: "andreas johnson", category: "People" } 
     ]; 

     $("#search").catcomplete({ 
      delay: 0, 
      source: data 
     }); 
    }); 
    </script> 



<div class="demo"> 
    <label for="search">Search: </label> 
    <input id="search" /> 
</div> 
+0

creo que hay un problema con ese ejemplo jQuery UI es que los elementos de la lista tienen que agruparse también por categoría, de lo contrario las categorías repiten. Por ejemplo, si agrega otro producto al final de la matriz de datos, terminará con una segunda categoría de Productos después de la primera categoría Personas. – j08691

+0

Acepto el problema con el agrupamiento de categorías. Debe haber una forma de iterar a través de los resultados, agruparlos en una matriz separada por categoría, luego generar la lista de resultados en base a esa matriz. – lukemcd

Respuesta

3

Una buena estrategia sería la creación de un objeto/hash que almacena categorías como llaves y conjuntos de elementos que coincidan con esa categoría como valores. En otras palabras, usted quiere construir algo como esto:

{ "Products": ["annhhx10", "annk K12", /*etc*/], 
    "People": ["anders andersson", "andreas andersson", /*etc*/] 
} 

Una vez que construir esto se puede iterar a través de él y la salida de cada categoría seguido de sus valores. La ventaja de esto es que todo lo que tiene que hacer para obtener el número de elementos es tomar la longitud de la matriz correspondiente a la categoría actual. Algo así como:

$.widget("custom.catcomplete", $.ui.autocomplete, { 
    _renderMenu: function(ul, items) { 
     var self = this, 
      categories = { }; 

     /* Build a dictionary/hash where keys are categories and values are 
     * arrays of items with that category 
     */ 
     $.each(items, function (index, item) { 
      if (!categories.hasOwnProperty(item.category)) { 
       categories[item.category] = [item]; 
      } else { 
       categories[item.category].push(item); 
      } 
     }); 

     /* Iterate over the hash we just built and display a category followed by its 
     * items. 
     */ 
     $.each(categories, function(category, items) { 
      if (category) { 
       ul.append("<li class='ui-autocomplete-category'>" + category + " (" + items.length + ")</li>"); 
      } 
      $.each(items, function (index, item) { 
       self._renderItem(ul, item); 
      }); 
     }); 
    } 
}); 

Ejemplo:http://jsfiddle.net/andrewwhitaker/vNtGd/

+0

¡Gracias, eso funciona genial! – lukemcd

0
$.widget("custom.catcomplete", $.ui.autocomplete, { 
      _renderMenu: function (ul, items) { 
       var self = this, 
       currentCategory = "", itemCount = 0, itemsLength = items.length - 1; 
       $.each(items, function (index, item) { 
        if (item.category != currentCategory) { 
         ul.find('.ui-autocomplete-category:last').text(function() { return $(this).text() + ' ' + itemCount }); 
         ul.append("<li class='ui-autocomplete-category'>" + item.category + "</li>"); 
         currentCategory = item.category; 
         itemCount = 1; 
        } 
        else { 
         itemCount++; 
        } 

        if (index === itemsLength) { 
         ul.find('.ui-autocomplete-category:last').text(function() { return $(this).text() + ' ' + itemCount }); 
        } 

        self._renderItem(ul, item); 
       }); 
      } 
     }); 
+0

para demostración en vivo, vea este enlace: http://jsfiddle.net/nanoquantumtech/gzzSm/ – Thulasiram

Cuestiones relacionadas