У меня есть select2, где мне нужно создавать теги, только если у меня есть разрешение. Мне нужно проверить разрешение ajax по идентификатору пользователя.
Теперь настройка - tags: true, и я ВСЕГДА могу создавать новые теги. (ОК)
Если установлен tags: false, я не могу создавать новые теги. (ОК)
Я пробовал использовать теги: function() { return false; }, но кажется, что теги все равно можно создать. (Плохо)
Моя цель - получить что-то вроде этого:
tags: function() {
$.ajax({
type: "POST",
async: false,
dataType:"json",
url: "ajax/check_permissione.php",
data: { 'user-id': 1 },
success: function(data, status) {
if ( data.PermissionOK == 1 ) {
return true;
}
return false;
}
});
}
Но я не знаю, могут ли теги принимать значение от функции?
Мой сценарий:
$("#test").select2({
tags: true, // <- if true create new tags, else only select available
createTag: function (params) {
return {
id: params.term,
text: params.term,
newOption: true
}
},
templateResult: function (data) {
var $result = $("<span></span>");
$result.text(data.text);
if (data.newOption) {
$result.append(" <em>(new option)</em>");
}
return $result;
}
}).on('select2:select', function (e) {
//others operations
});
Да, но я пробовал и простые теги: function () {return false; } попробовать и не работает function ()
Я думаю, вам придется повторно инициализировать select2 в зависимости от ответа вашего ajax.
Помимо проблемы, вам необходимо удалить async: false. Он устарел, а также является ужасной практикой, и его поддержка скоро будет прекращена.






Просто замените tags: true на tags: permission, где permission содержит значение, указывающее, есть ли у идентификатора пользователя разрешение или нет. Если вы проверите разрешение через ajax, вы можете сохранить результат в переменной. Вот иллюстрация.
var permission = true;
$.ajax({
type: "POST",
async: false,
dataType:"json",
url: "ajax/check_permissione.php",
data: { 'user-id': 1 },
success: function(data, status) {
if ( data.PermissionOK == 1 ) {
permission = true;
} else {
permission = false;
}
}
});
Если вы используете ajax, сначала выполните этот код перед использованием select2.
Довожу до вашего сведения. Вы можете реализовать этот способ, если хотите избежать использования async: false. (Используя обещание jQuery)
var permission = true;
var result =
$.post({
dataType:"json",
url: "ajax/check_permissione.php",
data: { 'user-id': 1 }
}).done(function(data, status) {
if ( data.PermissionOK == 1 ) {
permission = true;
} else {
permission = false;
}
});
// called when ajax process done.
result.promise().done(function() {
// $("#test").select2({ ~
});
у вас работает ajax?