Frage

Ich versuche, Typeahead + Bloodhound einzurichten, um eine Suche mit Vorschlägen für ein Feld durchzuführen.Der HTML-Code für das Feld lautet wie folgt:

<div class="col-sm-10" id="products_forms">
    <input type="text" placeholder="Producto" id="ProductoForm_0_product_id" name="ProductoForm[0][product_id]" class="form-control typeahead">
</div>

Ich benutze zwei Hauptfunktionen von Symfony:eine für die Rückgabe aller Produkte und verwenden Sie diese als prefetch und der andere für die gefilterten Produkte.So sehen die Routen für diese Funktionen aus:

 // the one I use as prefetch parameter in bloodhound
 * @Route("/get_products", name="all_products")

 // the one I use as remote
 * @Route("/get_products/{filter}", name="filter_products")

Wie Sie sehen, hat der erste keine Parameter erhalten, da er alle Produkte als JSON-Werte zurückgibt, der zweite jedoch {filter} als Argument für die Durchführung der LIKE und gibt nur die gefilterten Produkte zurück.

Jetzt weiß ich überhaupt nicht, wie Bloodhound funktioniert, also lese ich das Dok und auch für den Schriftkopf lesen Sie die Dok und nehmen Sie ein Beispiel aus hier der Remote eins und machte diesen Code:

// Trigger typeahead + bloodhound
var products = new Bloodhound({
    datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    prefetch: Routing.generate('all_products'),
    remote: Routing.generate('filter_products', { 'filter' : '%query' })
});

products.initialize();
$('#products_forms .typeahead').typeahead(null, {
    name: 'products',
    displayKey: 'value',
    source: products.ttAdapter()
});

Stimmt das?Ich meine, wenn die Seite geladen wird, werden alle Produkte vorab abgerufen, aber wenn ich welche eingebe .typeahead element bekomme ich nur die gefilterten?Ich weiß nicht ob %query ist der richtige Wert, an den ich übergeben sollte filter_products route, um die gefilterten Werte zu erhalten.Irgendeine Hilfe?

Dies ist das erste Mal, dass ich Typeahead + Bloodhound verwende

War es hilfreich?

Lösung

Ersetzen remote: Routing.generate('filter_products', { 'filter' : '%query' }) mit z.B.

var url = Routing.generate('filter_products', {filter: 'WILDCARD'});
// ... some code
remote: {
            url: url,
            wildcard: 'WILDCARD'
        }

Dadurch wird zuerst eine allgemeine URL mit dem RoutingBundle generiert und 'PLATZHALTER' als Filter verwendet.Dann weisen Sie Bloodhound an, 'WILDCARD' für die URL als Platzhalter zu verwenden, und es wird es perfekt durch die eingegebene Abfrage ersetzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top