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

Установка начальных значений при загрузке с помощью Select2 с Ajax

У меня есть элементы управления select2, созданные с помощью Ajax (имеют как одно, так и несколько). Я пытаюсь иметь некоторые значения при загрузке страницы, но я не могу заставить это работать. Мой код для select2 приведен ниже:

function AjaxCombo(element, url, multival ){  // multival = true or false
  multival = multival || false;
  $(element).select2({
   minimumInputLength: 2,
   multiple: multival,
   separator: '|',
   ajax: {
     url: url,
     dataType: 'json',
     data: function (term, page) {
        var targetname = $(this).attr('name');
        var target = targetname.slice(targetname.indexOf("[")+1, targetname.indexOf("]"));
       return {
         targettype: "search",
         target: target,
         search: term
       };
     },
     results: function (data, page) {
       return { results: data };
     }
   }
 });
}
AjaxCombo(".ajaxselect", "includes/linkedcontrol.php", false);
AjaxCombo(".ajaxmultiselect", "includes/linkedcontrol.php", true);

Комбинация Ajax отлично работает, у меня возникают проблемы только при загрузке начальных значений. Я пробовал этот код ниже, но не смог заставить его работать:

initSelection : function (element, callback) {
    var elementText = $(element).attr('data-initvalue');
    callback(elementText);
}

Мой HTML-код из php возвращается, как показано ниже:

<input name='header[country]' class='ajaxselect'  data-initvalue='[{"id":"IN","name":"India"}]' data-placeholder='Select Country' value='' />

Я вижу, что значения заполняются из php, только у моего jquery возникают проблемы. Мои значения в элементе управления отображаются как US | United States of America. Я предполагаю, что я отредактировал источник select2 для получения этого формата по умолчанию, не используя формат.

Может ли кто-нибудь помочь мне заполнить значения по умолчанию? Спасибо заранее.

EDIT: Этот вопрос относится к версии Select2 < 4.0. Этот параметр удален из версии 4.0 и теперь намного проще.

4b9b3361

Ответ 1

Функция, которую вы указываете как initSelection, вызывается с исходным аргументом value as. Поэтому, если value пуст, функция не вызывается.
Когда вы указываете value='[{"id":"IN","name":"India"}]' вместо data-initvalue, функция вызывается, и выбор может быть инициализирован.

Ответ 2

Возможно, эта работа для вас! Это работает для меня...

initSelection: function (element, callback) {

            callback({ id: 1, text: 'Text' });
}

Хорошо проверьте, что код правильно написан, моя проблема была в initSelection, у меня было initSelection

Ответ 3

Обновлено до новой версии:

Попробуйте это решение здесь http://jsfiddle.net/EE9RG/430/

$('#sel2').select2({
multiple:true,
ajax:{}}).select2({"data": 
     [{"id":"2127","text":"Henry Ford"},{"id":"2199","text":"Tom Phillips"}]});

Ответ 4

Ravi, для 4.0.1-rc.1:

  • Добавьте все элементы <option> внутри <select>.
  • вызов $element.val(yourarray).trigger("change"); после select2 функции init.

HTML:

<select name="Tags" id="Tags" class="form-control input-lg select2" multiple="multiple">
       <option value="1">tag 1</option>
       <option value="2">tag 2</option>
       <option value="3">tag 3</option>
 </select>

JS:

var $tagsControl = $("#Tags").select2({
        ajax: {
            url: '/Tags/Search',
            dataType: 'json',
            delay: 250,
            results: function (data) {
                return {
                    results: $.map(data, function (item) {
                        return {
                            text: item.text,
                            id: item.id
                        }
                    })
                };
            },
            cache: false
        },
        minimumInputLength: 2,
        maximumSelectionLength: 6
    });

    var data = [];
    var tags = $("#Tags option").each(function () {
        data.push($(this).val());
    });
    $tagsControl.val(data).trigger("change");

Этот вопрос был отправлен, но он все еще открыт. https://github.com/select2/select2/issues/3116#issuecomment-146568753

Ответ 5

Очень странный способ передачи данных. Я предпочитаю получать строку/объект JSON с сервера, а затем присваивать значения и прочее.

В любом случае, когда вы делаете это var elementText = $(element).attr('data-initvalue');, вы получаете это [{"id":"IN","name":"India"}]. В результате вы должны использовать PARSE так, как было предложено выше, чтобы получить реальные значения для id ( "IN" ) и имени ( "Индия" ). Теперь есть два сценария: multi-select и single-value Select2.

Одиночные значения:

$(element).select2({
    initSelection : function (element, callback) {
        var data = {id: "IN", text: "INDIA"};
        callback(data);
    }//Then the rest of your configurations (e.g.: ajax, allowClear, etc.)
});

Multi-Select

$("#tags").select2({
    initSelection : function (element, callback) {
        var countryId = "IN"; //Your values that somehow you parsed them
        var countryText = "INDIA";

        var data = [];//Array

        data.push({id: countryId, text: countryText});//Push values to data array


        callback(data); //Fill'em
    }
});

СЕЙЧАС ЗДЕСЬ ТРИК! Как предложил belov91, вы ДОЛЖНЫ положить это...

$(element).select2("val", []);

Даже если это одиночный или многозначный Select2. С другой стороны, помните, что вы не можете назначить функцию Select2 ajax тегу <select>, это должно быть <input>.

Надеюсь, что это помогло вам (или кому-то).

Bye.

Ответ 6

Я добавил

initSelection: function (element, callback) {

      callback({ id: 1, text: 'Text' });
}

НО также

.select2('val', []);

в конце.

Это решило мою проблему.

Ответ 7

var elem = $("#container").find("[name=elemMutliOption]");
for (var i = 0; i < arrDynamicList.length; i++)
{
   elem.find("option[value=" + arrDynamicList[i] + "]").attr("selected", "selected");
}
elem.select2().trigger("change");

Это будет работать для людей, которые используют один и тот же вид для нескольких разделов на странице, при этом будет сказано, что он будет работать одинаково для автоматической настройки значений по умолчанию на вашей странице или лучше страницы EDIT.

"FOR" проходит через массив, у которого уже есть параметры, уже загруженные в DOM.

Ответ 8

вы можете использовать следующие

$(element).select2("data",[ { id: result.id, text: "جابر احمد الصباح" },
    { id: 2, text: "خليل محمد خليل" }]);

Ответ 9

В моем случае проблема заключалась в рендеринге вывода. Поэтому я использовал текст по умолчанию, если данные ajax еще не представлены.

  templateSelection: function(data) {
    return data.name || data.element.innerText;
  }

Ответ 10

Измените значение после загрузки страницы

$('#data').val('').change();