Подтвердить что ты не робот

Select2 и обратный вызов initSelection

При загрузке страницы я пытаюсь использовать initSelection для выбора ID 60 (заданное значение поля ввода). Кажется, я не могу заставить его работать нормально.

Сценарии PHP отлично работают и возвращают правильные значения, но как я могу заставить JS правильно выполнить обратный вызов?

JavaScript:

$(document).ready(function() {
    $('#editAlbumArtistId').select2({
            placeholder: 'Search names',
            ajax: {
                url: "/jQueryScripts/jQuerySelectListArtists.php",
                dataType: 'json',
                quietMillis: 100,
                data: function (term, page) {
                    return {
                        term: term, //search term
                        page_limit: 10 // page size
                    };
                },
                results: function (data, page) {
                    return {results: data.results};
                }

            },
            initSelection: function(element, callback) {

            var id = $(element).val();
            if(id !== "") {
                $.ajax("/jQueryScripts/jQuerySelectListArtists.php", {
                    data: {id: id},
                    dataType: "json"
                }).done(function(data) {
                    callback(data);
                });
            }
        }
    });
});

HTML:

<p>
    <input type='hidden' value="60" data-init-text='Search names' name='editAlbumArtistId' id='editAlbumArtistId' style="width:180px;"/>
</p>

Каждый раз, когда я обновляю страницу, я вижу, что PHP script выполняется и возвращает правильный идентификатор и текст. Однако поле не обновляется, и я серьезно пробовал все, что мог придумать.

Я использую Select2 3.4.3.

Любая помощь будет принята с благодарностью.

4b9b3361

Ответ 1

Наконец решил! Я полагал, что select2 не хотел массив, так как это одно значение, поэтому я выбрал первый элемент массива data.results.

callback(data.results[0]);

И если вы установили несколько: true, просто примите весь массив результатов;

callback(data.results);

Ответ 2

Вы также можете использовать это для меньшего кода:

    initSelection: function(element, callback) {
        return $.getJSON("/jQueryScripts/jQuerySelectListArtists.php?id=" + element.val(), null, function(data) {
            return callback(data[0]);
        });
    }

Я видел этот пример в вики Select2, но мне приходилось иметь дело с обратным вызовом (данными) и обратным вызовом (данные [0]), как и вы.

Ответ 3

Помните: свойства - это строка.

Посмотрите формат json:

{ 'id': 1, 'text': 'work' }

{ id: 1, text: 'dont work' }

С# ASP.NET MVC Code:

@Html.HiddenFor(m => m.uniqueCode)

Код Javascript:

$("#ddlCustomer").select2({
            allowClear: true,
            ajax: {                    
                type: 'GET',
                url: '/Customer/jsonLoadSelect2',
                data: function (params) {
                    return {
                        uniqueCode: params.term
                    };
                },
                traditional: true,
                dataType: 'json',
                processResults: function (data) {
                    $("#ddlCustomer").empty();
                    $.each(data, function (index, value) {
                        $("#ddlddlCustomer").append('<option value=' + value.id + '>' + value.text + '</option>')
                    });
                    return {
                        results: data
                    };                        
                }
            },
            escapeMarkup: function (markup) { return markup; }, 
            minimumInputLength: 0,
            cache: true,
            initSelection: function(element, callback) {
                var id = $(element).val();
                if (id !== "") {
                    $.ajax("/Customer/jsonLoadSelect2/" + id, {
                        dataType: "json"
                    }).done(function (data) { callback({ 'id': id, 'text': $('#uniqueCode').val() }) });
                }
            }
        });