代码之家  ›  专栏  ›  技术社区  ›  charlie

被选中的。js:在ajax回调中自动选择新创建的值

  •  1
  • charlie  · 技术社区  · 8 年前

    我在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){
    
            }
        }
    })
    

    函数listRefresh()

    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"); 在控制台上,它可以工作。

    data.id 应该定义。。。

    它仍然不起作用,我不知道为什么。。。

    //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">&times;</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();
                });
            });
        }
    

    如果您有更好的解决方案,或者解释变量丢失的原因,我将不胜感激:)

    编辑3

    Variable lost in ajax request

    1 回复  |  直到 8 年前
        1
  •  2
  •   gaetanoM    8 年前

    您的问题在以下片段中:

    $('#site_id').load(src_url+ " #site_id >*", function(id) {
            $('.fa-spin').remove();
            $('#site_id_chosen').show();
     }).val(id).trigger("chosen:updated");
    

    val(id) 此外,您已经在主ajax中调用了相同的方法。

    $('#site_id').val(data.id).trigger("chosen:updated");
    

    在成功加载方法回调中。

    ). 根据代码,在没有任何html信息的情况下,我假设 负载 幻想会覆盖您选择的元素。这意味着您需要在新元素上重新创建一个新实例,并删除前一个实例。这是以下两个操作:

    1. $(“#site_id”)。选择(“销毁”);之前 惯性导航与制导
    2. $(“#site_id”)。已选择({…您的选项..})。val(数据id)。触发器(“已选择:已更新”);在成功加载回调中

    $.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();
            });
        });
    }