Chosen.js : 在 ajax 回调中自动 select 新创建的值
Chosen.js : automatically select freshly created value in ajax callback
我在 ajax 中有此代码:
主要功能
$.ajax({
type:"POST",
url:dest_url,
data:$(this).serialize(),
dataType: 'json',
success: function(data){
if($.isEmptyObject(data.error)){
listRefresh(data.id);
$('#site_id').val(data.id).trigger("chosen:updated");
}else{
console.log(data.error);
}
},
error: function(data){
}
}
})
函数列表刷新()
function listRefresh(id){
$('#site_id_chosen').hide().parent().append('<i class="fa fa-circle-o-notch fa-spin"></i>');
$.ajaxSetup({
header:$('meta[name="_token"]').attr('content')
})
var src_url = location.href + '?sites='+id;
$.ajax({
url: location.href,
type: 'GET',
cache: false
})
.done(function(id) {
$('.panel-heading').load(src_url + " .panel-heading >*");
$('#site_id').load(src_url+ " #site_id >*", function(id) {
$('.fa-spin').remove();
$('#site_id_chosen').show();
}).val(id).trigger("chosen:updated");
})
.fail(function() {
$('#site_id').load(location.href+ " #site_id >*", function() {
$(this).val('').trigger("chosen:updated");
$('.fa-spin').remove();
$('#site_id_chosen').show();
});
});
}
除了选择的选定值的更新外,一切正常。
当我做 console.log(data.id);
时,它起作用了。
当我从控制台执行 $('#site_id').val(40).trigger("chosen:updated");
时,它起作用了。
我以为是因为ajax是异步的,但是我的代码在成功回调中,所以应该定义data.id
...
我也尝试更新 listRefresh() 函数中选择的选定值,但没有任何效果。
编辑
还是不行,不知道为什么...
这是我的完整代码,更新了你的代码:
//Création d'un nouveau site en ajax
$('#creer-site form').on('submit',function(e){
var base = "{{ url('/') }}";
var dest_url = base + '/sites';
$.ajaxSetup({
header:$('meta[name="_token"]').attr('content')
})
e.preventDefault(e);
$.ajax({
type:"POST",
url:dest_url,
data:$(this).serialize(),
dataType: 'json',
success: function(data){
if($.isEmptyObject(data.error)){
console.log(data);
$('.alert').remove();
$('.modal').modal('hide');
successHtml = '<div class="alert alert-success alert-dismissible" role="alert"><button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">×</span><span class="sr-only">Fermer</span></button><span class="fa fa-check fa-lg"></span>';
successHtml += data.message;
successHtml += '</div>';
$('.header-container').after( successHtml );
listRefresh(data.id); // on rafraichit la liste et on sélectionne l'objet nouvellement créé
}else{
console.log(data.error);
}
},
error: function(data){
$('.alert').remove();
$('.modal').animate({ scrollTop: 0 }, 'fast');
errorsHtml = '<div class="alert alert-danger"><span class="fa fa-warning fa-lg"></span><strong> Une ou plusieurs erreurs ont été detectées :</strong><ul>';
$.each(data.responseJSON, function(key, value) {
errorsHtml += '<li>' + value + '</li>';
});
errorsHtml += '</ul></div>';
$('#creer-site form').prepend( errorsHtml );
}
})
});
// on rafraichit la liste et on sélectionne l'objet nouvellement créé
function listRefresh(id){
$('#site_id_chosen').hide().parent().append('<i class="fa fa-circle-o-notch fa-spin"></i>');
$.ajaxSetup({
header:$('meta[name="_token"]').attr('content')
})
var src_url = location.href + '?sites='+id;
$.ajax({
url: location.href,
type: 'GET',
cache: false
})
.done(function(id) {
$('.panel-heading').load(src_url + " .panel-heading >*");
$("#site_id").chosen("destroy");
$('#site_id').load(src_url+ " #site_id >*", function(id) {
$("#site_id").chosen({
no_results_text: "Aucun résultat pour ",
search_contains: true,
placeholder_text_single: "Sélectionner...",
allow_single_deselect:true,
width: "300px"
}).val(id).trigger("chosen:updated");
$('.fa-spin').remove();
$('#site_id_chosen').show();
});
})
.fail(function() {
$('#site_id').load(location.href+ " #site_id >*", function() {
$(this).val('').trigger("chosen:updated");
$('.fa-spin').remove();
$('#site_id_chosen').show();
});
});
}
编辑 2
由于某些原因,js 变量在 ajax 调用期间丢失,根据调试:当我观察 'id' 变量时,它在确切的时刻变为 'undefined'函数启动 ajax 调用。
一个临时解决方案是在隐藏输入中写入 id,这样我可以在 ajax 再次调用时获取它(它非常有效),但这非常丑陋...
如果你有更好的解决方案,也许能解释一下变量丢失的原因,我将不胜感激:)
编辑 3
我最新 "bug" 的解决方案在这里:
您的问题在此片段中:
$('#site_id').load(src_url+ " #site_id >*", function(id) {
$('.fa-spin').remove();
$('#site_id_chosen').show();
}).val(id).trigger("chosen:updated");
val(id) 会在以后运行 load 方法时立即应用。
此外,您已经在主 ajax.
中调用了相同的方法
因此我建议移动这一行:
$('#site_id').val(data.id).trigger("chosen:updated");
在成功加载方法回调中。
load方法从服务器获取数据并将返回的HTML放入匹配的元素中(即:总是site_id)。从代码中,没有关于您的 html 的任何信息,我假设 load 函数会覆盖您选择的元素。这意味着您需要在新元素上重新创建一个新实例并删除前一个实例。这是以下两个操作:
- $("#site_id").chosen("destroy");在 loading
之前
- $("#site_id").chosen({...你的选择..}).val(data.id).trigger("chosen:updated");成功加载回调
您的代码将是:
$.ajax({
type: "POST",
url: dest_url,
data: $(this).serialize(),
dataType: 'json',
success: function (data) {
if ($.isEmptyObject(data.error)) {
listRefresh(data.id);
} else {
console.log(data.error);
}
},
error: function (data) {
}
})
function listRefresh(id) {
$('#site_id_chosen').hide().parent().append('<i class="fa fa-circle-o-notch fa-spin"></i>');
$.ajaxSetup({
header: $('meta[name="_token"]').attr('content')
})
var src_url = location.href + '?sites=' + id;
$.ajax({
url: location.href,
type: 'GET',
cache: false
}).done(function (data) {
$('.panel-heading').load(src_url + " .panel-heading >*");
//
// remove chosen:
//
$("#site_id").chosen("destroy");
$('#site_id').load(src_url + " #site_id >*", function (data) {
//
// next row added
//
$("#site_id").chosen({...your options..}).val(id).trigger("chosen:updated");
$('.fa-spin').remove();
$('#site_id_chosen').show();
}); // USELESS .val(id).trigger("chosen:updated");
}).fail(function () {
$('#site_id').load(location.href + " #site_id >*", function () {
$(this).val('').trigger("chosen:updated");
$('.fa-spin').remove();
$('#site_id_chosen').show();
});
});
}
我在 ajax 中有此代码:
主要功能
$.ajax({
type:"POST",
url:dest_url,
data:$(this).serialize(),
dataType: 'json',
success: function(data){
if($.isEmptyObject(data.error)){
listRefresh(data.id);
$('#site_id').val(data.id).trigger("chosen:updated");
}else{
console.log(data.error);
}
},
error: function(data){
}
}
})
函数列表刷新()
function listRefresh(id){
$('#site_id_chosen').hide().parent().append('<i class="fa fa-circle-o-notch fa-spin"></i>');
$.ajaxSetup({
header:$('meta[name="_token"]').attr('content')
})
var src_url = location.href + '?sites='+id;
$.ajax({
url: location.href,
type: 'GET',
cache: false
})
.done(function(id) {
$('.panel-heading').load(src_url + " .panel-heading >*");
$('#site_id').load(src_url+ " #site_id >*", function(id) {
$('.fa-spin').remove();
$('#site_id_chosen').show();
}).val(id).trigger("chosen:updated");
})
.fail(function() {
$('#site_id').load(location.href+ " #site_id >*", function() {
$(this).val('').trigger("chosen:updated");
$('.fa-spin').remove();
$('#site_id_chosen').show();
});
});
}
除了选择的选定值的更新外,一切正常。
当我做 console.log(data.id);
时,它起作用了。
当我从控制台执行 $('#site_id').val(40).trigger("chosen:updated");
时,它起作用了。
我以为是因为ajax是异步的,但是我的代码在成功回调中,所以应该定义data.id
...
我也尝试更新 listRefresh() 函数中选择的选定值,但没有任何效果。
编辑
还是不行,不知道为什么... 这是我的完整代码,更新了你的代码:
//Création d'un nouveau site en ajax
$('#creer-site form').on('submit',function(e){
var base = "{{ url('/') }}";
var dest_url = base + '/sites';
$.ajaxSetup({
header:$('meta[name="_token"]').attr('content')
})
e.preventDefault(e);
$.ajax({
type:"POST",
url:dest_url,
data:$(this).serialize(),
dataType: 'json',
success: function(data){
if($.isEmptyObject(data.error)){
console.log(data);
$('.alert').remove();
$('.modal').modal('hide');
successHtml = '<div class="alert alert-success alert-dismissible" role="alert"><button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">×</span><span class="sr-only">Fermer</span></button><span class="fa fa-check fa-lg"></span>';
successHtml += data.message;
successHtml += '</div>';
$('.header-container').after( successHtml );
listRefresh(data.id); // on rafraichit la liste et on sélectionne l'objet nouvellement créé
}else{
console.log(data.error);
}
},
error: function(data){
$('.alert').remove();
$('.modal').animate({ scrollTop: 0 }, 'fast');
errorsHtml = '<div class="alert alert-danger"><span class="fa fa-warning fa-lg"></span><strong> Une ou plusieurs erreurs ont été detectées :</strong><ul>';
$.each(data.responseJSON, function(key, value) {
errorsHtml += '<li>' + value + '</li>';
});
errorsHtml += '</ul></div>';
$('#creer-site form').prepend( errorsHtml );
}
})
});
// on rafraichit la liste et on sélectionne l'objet nouvellement créé
function listRefresh(id){
$('#site_id_chosen').hide().parent().append('<i class="fa fa-circle-o-notch fa-spin"></i>');
$.ajaxSetup({
header:$('meta[name="_token"]').attr('content')
})
var src_url = location.href + '?sites='+id;
$.ajax({
url: location.href,
type: 'GET',
cache: false
})
.done(function(id) {
$('.panel-heading').load(src_url + " .panel-heading >*");
$("#site_id").chosen("destroy");
$('#site_id').load(src_url+ " #site_id >*", function(id) {
$("#site_id").chosen({
no_results_text: "Aucun résultat pour ",
search_contains: true,
placeholder_text_single: "Sélectionner...",
allow_single_deselect:true,
width: "300px"
}).val(id).trigger("chosen:updated");
$('.fa-spin').remove();
$('#site_id_chosen').show();
});
})
.fail(function() {
$('#site_id').load(location.href+ " #site_id >*", function() {
$(this).val('').trigger("chosen:updated");
$('.fa-spin').remove();
$('#site_id_chosen').show();
});
});
}
编辑 2
由于某些原因,js 变量在 ajax 调用期间丢失,根据调试:当我观察 'id' 变量时,它在确切的时刻变为 'undefined'函数启动 ajax 调用。
一个临时解决方案是在隐藏输入中写入 id,这样我可以在 ajax 再次调用时获取它(它非常有效),但这非常丑陋...
如果你有更好的解决方案,也许能解释一下变量丢失的原因,我将不胜感激:)
编辑 3
我最新 "bug" 的解决方案在这里:
您的问题在此片段中:
$('#site_id').load(src_url+ " #site_id >*", function(id) {
$('.fa-spin').remove();
$('#site_id_chosen').show();
}).val(id).trigger("chosen:updated");
val(id) 会在以后运行 load 方法时立即应用。 此外,您已经在主 ajax.
中调用了相同的方法因此我建议移动这一行:
$('#site_id').val(data.id).trigger("chosen:updated");
在成功加载方法回调中。
load方法从服务器获取数据并将返回的HTML放入匹配的元素中(即:总是site_id)。从代码中,没有关于您的 html 的任何信息,我假设 load 函数会覆盖您选择的元素。这意味着您需要在新元素上重新创建一个新实例并删除前一个实例。这是以下两个操作:
- $("#site_id").chosen("destroy");在 loading 之前
- $("#site_id").chosen({...你的选择..}).val(data.id).trigger("chosen:updated");成功加载回调
您的代码将是:
$.ajax({
type: "POST",
url: dest_url,
data: $(this).serialize(),
dataType: 'json',
success: function (data) {
if ($.isEmptyObject(data.error)) {
listRefresh(data.id);
} else {
console.log(data.error);
}
},
error: function (data) {
}
})
function listRefresh(id) {
$('#site_id_chosen').hide().parent().append('<i class="fa fa-circle-o-notch fa-spin"></i>');
$.ajaxSetup({
header: $('meta[name="_token"]').attr('content')
})
var src_url = location.href + '?sites=' + id;
$.ajax({
url: location.href,
type: 'GET',
cache: false
}).done(function (data) {
$('.panel-heading').load(src_url + " .panel-heading >*");
//
// remove chosen:
//
$("#site_id").chosen("destroy");
$('#site_id').load(src_url + " #site_id >*", function (data) {
//
// next row added
//
$("#site_id").chosen({...your options..}).val(id).trigger("chosen:updated");
$('.fa-spin').remove();
$('#site_id_chosen').show();
}); // USELESS .val(id).trigger("chosen:updated");
}).fail(function () {
$('#site_id').load(location.href + " #site_id >*", function () {
$(this).val('').trigger("chosen:updated");
$('.fa-spin').remove();
$('#site_id_chosen').show();
});
});
}