Wie verwende ich Select2 mit JSON über eine Ajax-Anfrage?

87

Mein Select2 3.4.5 funktioniert nicht mit JSON-Daten.

Hier ist mein Eingabefeld für HTML:

<input class='form-control col-lg-5 itemSearch' type='text' placeholder='select item' />

… Und mein JavaScript

$(".itemSearch").select2({
    placeholder: "Search for an Item",
    minimumInputLength: 2,
    ajax: {
        url: "/api/productSearch",
        dataType: 'json',
        quietMillis: 100,
        data: function (term, page) {
            return {
                option: term
            };
        },
        results: function (data, page) {
            var more = (page * 10) < data.total;
            return {
                results: data.itemName,
                more: more
            };
        }
    },
    formatResult: function (data, term) {
        return data;
    },
    formatSelection: function (data) {
        return data;
    },
    dropdownCssClass: "bigdrop",
    escapeMarkup: function (m) {
        return m;
    }
});

Ich habe mit Laravel 4 eine API erstellt, die einen Wert zurückgibt, wenn ich etwas in mein Textfeld eingebe.

Hier ist das Ergebnis, wenn ich "test" in mein Textfeld eingebe:

[{"itemName":"Test item no. 1","id":5},
{"itemName":"Test item no. 2","id":6},
{"itemName":"Test item no. 3","id":7},
{"itemName":"Test item no. 4","id":8},
{"itemName":"Test item no. 5","id":9},
{"itemName":"Test item no. 6","id":10},
{"itemName":"Test item no. 7","id":11}]

Ich kann das Ergebnis nicht zu meiner Select2-Dropdown-Liste hinzufügen. Ich denke formatSelectionund formatResultverursache das Problem, weil ich nicht weiß, welcher Parameter darauf platziert werden soll. Ich weiß nicht, wo ich diese Parameter wie Container, Objekt und Abfrage sowie die Werte erhalten soll, die zurückgegeben werden sollen, oder ist meine JSON-Antwort falsch?

melvnberd
quelle

Antworten:

110

Hier haben Sie ein Beispiel

$("#profiles-thread").select2({
    minimumInputLength: 2,
    tags: [],
    ajax: {
        url: URL,
        dataType: 'json',
        type: "GET",
        quietMillis: 50,
        data: function (term) {
            return {
                term: term
            };
        },
        results: function (data) {
            return {
                results: $.map(data, function (item) {
                    return {
                        text: item.completeName,
                        slug: item.slug,
                        id: item.id
                    }
                })
            };
        }
    }
});

Es ist sehr leicht

Tolo Palmer
quelle
2
Vielen Dank für den Vorschlag an $ .map
tacos_tacos_tacos
Können Sie den Parameter "slug" erklären?
IcedDante
item ist ein Objekt mit den Eigenschaften completeName, slug und id. Dies ist nur ein Beispiel, kopieren und einfügen.
Tolo Palmer
2
Slug es ist eine tatsächliche Eigenschaft des Artikels, Ihr Artikel, ich habe dies hinzugefügt, wie Sie sehen können, wie man zusätzliche Parameter hinzufügt;)
Tolo Palmer
4
Ich erhalte diesen Fehler jquery.min.js: 2 Nicht erfasster TypeError: Die Eigenschaft 'length' von null kann nicht gelesen werden, wenn mein Server kein Ergebnis zurückgibt.
Soptareanu Alex
107

für select2 v4.0.0 etwas anders

$(".itemSearch").select2({
    tags: true,
    multiple: true,
    tokenSeparators: [',', ' '],
    minimumInputLength: 2,
    minimumResultsForSearch: 10,
    ajax: {
        url: URL,
        dataType: "json",
        type: "GET",
        data: function (params) {

            var queryParameters = {
                term: params.term
            }
            return queryParameters;
        },
        processResults: function (data) {
            return {
                results: $.map(data, function (item) {
                    return {
                        text: item.tag_value,
                        id: item.tag_id
                    }
                })
            };
        }
    }
});
Rasiermesserfisch
quelle
8
Kann das nicht zum Laufen bringen ... :( Es werden keine Anrufe an den Server getätigt.
Simanas
Es hat funktioniert, danke, der Fehler, den ich gemacht habe, war nicht richtig zuzuordnen idund textSchlüsselwerte.
Ja8zyjits
17

In Version 4.0.2 etwas anders Nur in processResultsund in result:

    processResults: function (data) {
        return {
            results: $.map(data.items, function (item) {
                return {
                    text: item.tag_value,
                    id: item.tag_id
                }
            })
        };
    }

Sie müssen hinzufügen data.itemsin result. itemsist Json Name:

{
  "items": [
    {"id": 1,"name": "Tetris","full_name": "s9xie/hed"},
    {"id": 2,"name": "Tetrisf","full_name": "s9xie/hed"}
  ]
}
Ebad Ghafoory
quelle
1
Wenn ich entfernen itemsaus data.itemswürde ich nicht hinzufügen müssen itemsAttribut auf die Antwort richtig? ;)
Yana Agun Siswanto
1
@bekicot ja, Sie geben nur an, $.map(data, function (item) ob Ihr json ein Array ist:[ {"id": 1,"text": "One"}, {"id": 2,"text": "Two"} ]
Tantowi Mustofa
2
Habe meinen Kopf gegen eine Wand geschlagen und das hat die Dinge geklärt. Vielen Dank, die Dokumentation für select2 fehlt stark.
Neil B.
10

Hier gebe ich Ihnen mein Beispiel, das -> Länderflagge, Stadt, Bundesland, Land enthält.

Hier ist meine Ausgabe.

Geben Sie hier die Bildbeschreibung ein

Fügen Sie diese beiden Cdn js oder Links hinzu.

<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.10/css/select2.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.10/js/select2.min.js"></script>

js Skript

//for apend flag of country.

function formatState (state) {
    console.log(state);
    if (!state.id) {
      return state.text;
    }
    var baseUrl = "admin/images/flags";
    var $state = $(
      '<span><img src="'+baseUrl+ '/' + state.contryflage.toLowerCase() + '.png"  class="img-flag" /> ' +state.text+ '</span>'
    );
    return $state;
  };


$(function(){
    $("#itemSearch").select2({
    minimumInputLength: 2,
    templateResult: formatState, //this is for append country flag.
    ajax: {
        url: URL,
        dataType: 'json',
        type: "POST",
        data: function (term) {
            return {
                term: term
            };
        },
        processResults: function (data) {
            return {
                results: $.map(data, function (item) {
                    return {
                        text: item.name+', '+item.state.name+', '+item.state.coutry.name,
                        id: item.id,
                        contryflage:item.state.coutry.sortname
                    }
                })
            };
        }

    }
});

Erwartete JSON-Antwort.

[
   {
      "id":7570,
      "name":"Brussels",
      "state":{
         "name":"Brabant",
         "coutry":{
            "sortname":"BE",
            "name":"Belgium",

         }
      }
   },
   {
      "id":7575,
      "name":"Brussels",
      "state":{
         "name":"Brabant Wallon",
         "coutry":{
            "sortname":"BE",
            "name":"Belgium",

         }
      }
   },
   {
      "id":7578,
      "name":"Brussel",
      "state":{
         "name":"Brussel",
         "coutry":{
            "sortname":"BE",
            "name":"Belgium",

         }
      }
   },

]
Dilip Hirapara
quelle
aber ich bin verwirrend in `data: function (term) {return {term: term}; }, `
Vikas Katariya
6

Auf diese Weise habe ich mein Problem behoben. Ich erhalte Daten in Datenvariablen und bei Verwendung der oben genannten Lösungen wurde ein Fehler angezeigt could not load results. Ich musste die Ergebnisse in processResults anders analysieren.

searchBar.select2({
            ajax: {
                url: "/search/live/results/",
                dataType: 'json',
                headers : {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')},
                delay: 250,
                type: 'GET',
                data: function (params) {
                    return {
                        q: params.term, // search term
                    };
                },
                processResults: function (data) {
                    var arr = []
                    $.each(data, function (index, value) {
                        arr.push({
                            id: index,
                            text: value
                        })
                    })
                    return {
                        results: arr
                    };
                },
                cache: true
            },
            escapeMarkup: function (markup) { return markup; },
            minimumInputLength: 1
        });
Chaudhry Waqas
quelle
1

Die Probleme können durch falsche Zuordnung verursacht werden. Sind Sie sicher, dass Ihre Ergebnismenge in "Daten" festgelegt ist? In meinem Beispiel gibt der Backend-Code Ergebnisse unter dem Schlüssel "items" zurück, sodass die Zuordnung folgendermaßen aussehen sollte:

results: $.map(data.items, function (item) {
....
}

und nicht:

 results: $.map(data, function (item) {
    ....
    }
Prüfer
quelle
1

Mein Ajax wird nie abgefeuert, bis ich das Ganze eingewickelt habe

setTimeout(function(){ .... }, 3000);

Ich habe es in einem montierten Bereich von Vue verwendet. es braucht mehr Zeit.

Apit John Ismail
quelle
0

Wenn keine Ajax-Anfrage ausgelöst wird, überprüfen Sie bitte die select2-Klasse im select-Element. Durch Entfernen der Klasse select2 wird dieses Problem behoben.

Sudin
quelle