Select2 4.0 начальное значение в режиме ajax

У меня есть следующее выбрать на моей странице:

<select><option value="1" selected="selected">Caption</option></select>

Я звоню select2 (v 4.0) init:

city.select2({
    ajax: {
        url: <...>,
        data: <...>,
        processResults: <...>,
        cache: true
    },
    escapeMarkup: function(markup){ return markup; },
    minimumInputLength: 0,
    templateResult: function(repo){ return repo.name; },
    templateSelection: function(repo){ return repo.name; }
});

Проблема в том, что select2 сбрасывает выбранное по умолчанию значение и показывает пустую строку. Есть ли способ установить значение по умолчанию на select2 init?

2 ответа

Вопрос был в вашем templateSelection метод, как вы ожидаете name свойство находиться на вашем объекте данных. Помимо того, что text теперь требуется, и вам не понадобится метод, если вы повторно отобразите его, вы не обрабатываете случай, когда объект данных имеет text имущество.

city.select2({
    ajax: {
        url: <...>,
        data: <...>,
        processResults: <...>,
        cache: true
    },
    escapeMarkup: function(markup){ return markup; },
    minimumInputLength: 0,
    templateResult: function(repo){ return repo.name || repo.text; },
    templateSelection: function(repo){ return repo.name || repo.text; }
});

Это должно исправить вашу проблему и правильно отобразить начальный выбор.

Документы select2 теперь имеют пример того, как это сделать.

// Set up the Select2 control
$('#mySelect2').select2({
  ajax: {
    url: '/api/students'
  }
});

// Fetch the preselected item, and add to the control
var studentSelect = $('#mySelect2');
$.ajax({
  type: 'GET',
  url: '/api/students/s/' + studentId
}).then(function (data) {
  // create the option and append to Select2
  var option = new Option(data.full_name, data.id, true, true);
  studentSelect.append(option).trigger('change');

  // manually trigger the `select2:select` event
  studentSelect.trigger({
    type: 'select2:select',
    params: {
      data: data
    }
  });
});

В основном, настройте select2 для ajax, а затем предварительно заполните нужным объектом. Волшебство сделано в последнюю очередь, .trigger() что заставляет select2 подобрать изменение и отобразить его.

Другие вопросы по тегам