2016-08-26 2 views
0

У меня есть элемент управления тегами select2. Когда тег не существует, пользователь может создать тег. Эти теги сохраняются в базе данных, но проблема в том, что я не знаю, как установить идентификатор тега, возвращенный для успеха ajax.Получите идентификатор из базы данных при создании тега в Select2

$tags.select2({ 
    placeholder: '- Select -', 
    tags: true, 
    tokenSeparators: [',', ' '], 
    createTag: function (params) { 
     if (params.term.trim() === '') { 
      return null; 
     } 
     return { 
      id: '', //How to get id here??? 
      text: params.term.toLowerCase(), 
      newTag: true // add additional parameters 
     } 
    }, 
    //Ajax to get tags here ommited 
}); 

$tags.on('select2:select', function (e) { 
    if (e.params.data.newTag) { 
     $.ajax({ 
      url: urlAddTag, 
      type: 'POST', 
      dataType: "json", 
      data: { tag: e.params.data.text.toLowerCase() }, 
      success: function (response) { 
       e.params.data.id = response.id; 
      }, 
      error: function (xhr, ajaxOptions, thrownError) { 
       var msg = JSON.parse(xhr.responseText); 
      } 
     }); 
    } 
}); 

В АЯКСЕ ответ я заходящий идентификатор, с которым тег был сохранен в базе данных, но я не знаю, как перейти к функции «createTag».

ответ

0

У меня была аналогичная проблема, и я решил следующим образом: я не ожидаю, что это приспособит 100% к вашему делу, но это может дать вам идею.

Мой поток работает таким образом:

  • в createTag, я просто создать некоторый случайный идентификатор, который будет отправлен АНИ
  • АНИ проигнорирует этот идентификатор и просто создает новую запись используя текст из компонента ВЫБ.2
  • АНЯ возвращает новый идентификатор (и текст) в ответ
  • в обратном вызове обновить тег на выбор2 с новым ID вы только что получили

Так, например, в вашем случае:

createTag: function(params) { 
    if (params.term.trim() === '') { 
     return null; 
    } 
    return { 
     id: 'new_attribute', 
     isNew: true, 
     text: params.term 
    }; 
} 

В сервере обратного вызова I поиск по тегам в управлении и обновить свой идентификатор с той, которую я получаю от сервера:

$('<option/>').val(response.id).html(response.text).appendTo($tags); //create a new option with id + text returned by the server 
var tags = $tags.val(); //get current values 
var index = tags.indexOf('new_attribute'); //look for new_attribute 
if (index !== -1) { 
    tags[index] = response.id; //replace 'new_attribute' with id got from the server 
} 
$tags.val(tags).trigger('change'); //update select2 
+0

Я думаю, что должен быть другой способ сделать это с обратным вызовом, но тем временем я буду использовать этот взлом, спасибо Дарио –

Смежные вопросы