2

「マルチセレクト」が有効な選択タグにChosen jQueryを使用するフォームを使用しています。この選択タグのオプションは、Ajax呼び出しの応答から生成されます。この select タグに加えて、1 つの textarea フィールドと、'single' select を持つ別の select タグがあります (これも別の Ajax 呼び出しによって入力され、Chosen が有効になっていません)。

また、bootstrapValidator を使用してこのフォームを検証しました。直面している問題は、テキストエリアと単一選択が検証されているが、選択された複数選択が検証されていないことです。複数選択は Ajax 応答を介して入力され、Chosen も適用されますが、送信時に検証されません。

HTML

<form role="form" id="createQueForm" enctype="multipart/form-data" novalidate>
    <div class="control-group form-group">
         <label class="control-label">Question Text</label>
         <textarea name="questionText" class="form-control" name="question" rows="3" ></textarea>
    </div>

    <div class="control-group form-group">
        <label class="control-label">Select Tags (upto 3)</label>
        <select multiple class="form-control" id="tags_select" name="tags" >
        </select>
    </div>

    <div class="control-group form-group">
        <label class="control-label">Asking as (User) :</label>
        <select class="form-control" id="user_select" name="user" >
            <option value="">Select User</option>
        </select>
    </div>
    <button type="submit" class="btn btn-default">Create</button>
</form>

ジャバスクリプト

$(document).ready(function() {

    $.ajax({
        url: "http://localhost:8080/xoxo/api/getAllTags",
        type: "POST",
        dataType: "json",
        crossDomain: true,
        contentType: "application/x-www-form-urlencoded",
        cache: false,
        beforeSend: function (xhr) {
            /////   Authorization header   /////
            xhr.setRequestHeader("Authorization", "Bearer "+token);
        },
        success: function (data) {
            var tags = data.tags;
            $.each(tags,function(i,val){
                $('#tags_select').append('<option value="'+val.name+'">'+val.name+'</option>')
            });
            $('#tags_select').chosen({no_results_text: "Oops, nothing found!",max_selected_options: 3});

        },
        error: function (jqXHR, textStatus, errorThrown) {

        }
    });

    $.ajax({
        url: "http://localhost:8080/xoxo/api/getAllUsers",
        type: "GET",
        dataType: "json",
        crossDomain: true,
        contentType: "application/x-www-form-urlencoded",
        cache: false,
        beforeSend: function (xhr) {
            /////   Authorization header   /////
            xhr.setRequestHeader("Authorization", "Bearer "+token);
        },
        success: function (data) {
            var users = data.users;
            $.each(users,function(i,val){
                $('#user_select').append('<option value="'+val.id+'">'+val.fName+' '+val.lName+'</option>')
            });

        },
        error: function (jqXHR, textStatus, errorThrown) {

        }
    });

    $('#createQueForm').bootstrapValidator({
        live: 'disabled',
        // This option will not ignore invisible fields which belong to inactive panels
        exclude: ':disabled',
        fields: {
            question: {
                validators: {
                    notEmpty: {
                        message: 'Question Text is required.'
                    }
                }
            },
            tags: {
                validators: {
                    notEmpty: {
                        message: 'Tags are required.'
                    }
                }
            },
            user: {
                validators: {
                    notEmpty: {
                        message: 'Asking User is required.'
                    }
                }
            }
        }
    })
    .on('success.form.bv', function(e) {
        // Prevent form submission
        e.preventDefault();

        // Get the form instance
        var $form = $(e.target);

        // Get the FormValidation instance
        var bv = $form.data('bootstrapValidator');

        // Use Ajax to submit form data
        var question = new Object();
        question.questionText = $('textarea[name=questionText]').val();
        question.tags = $('#tags_select').val();
        question.userId = $('#user_select').val();
        $.ajax({
            url: "http://localhost:8080/xoxo/api/createQuestionOnWeb",
            data: question,
            type: "POST",
            dataType: "json",
            crossDomain: true,
            contentType: "application/x-www-form-urlencoded",
            cache: false,
            beforeSend: function (xhr) {
                /////   Authorization header   /////
                xhr.setRequestHeader("Authorization", "Bearer "+token);
            },
            success: function (data) {
                if(data.status == "success"){
                    $('.alert-danger').hide();
                    $('.alert-success').show();
                    location.href = "questions_list.php";
                }else{
                    $('.alert-success').hide();
                    $('.alert-danger').html(data.errorReason).show();
                }
            },
            error: function (jqXHR, textStatus, errorThrown) {
                $('.alert-success').hide();
                $('.alert-danger').html('Oops..! Something went wrong.').show();
            }
        });
    });     
});

Ajax 呼び出しによってオプションが入力された後、選択された複数選択タグの検証を有効にする方法を理解するのを手伝ってください。

4

1 に答える 1

0

同様の問題があり、それに対する答えが見つかりませんでした。以下は、誰かを助けるかもしれない私の解決策です。ここで対処すべき問題が 2 つあります。

  1. 選択された元の選択/入力を使用しません。display:none を実行し、ユーザー入力用に独自の div を作成します。ここでのアドバイスに従って、非表示フィールドで検証作業を行う必要があります。追加:

    $.validator.setDefaults({ ignore: ":hidden:not(select)" });

  2. 次に、選択したフィールドの検証は正常に機能しますが、ajax async の変更により中断されます。Validate は、ユーザーの変更としてドロップダウンを設定し、それに成功クラスを割り当てます。これを回避する方法は、jquery のツールボックスからwhenを使用して非同期の実行後に検証を遅らせることです。ajax 呼び出しをラップし、次の行に沿って関数で初期化を検証します。

    $.when(populateAjaxSelects()).then(function(){ initialiseValidate(); });

編集:わかりました。ブートストラップバリデーターではなく、 jQuery Validateを使用しました。ただし、ここでも同じ一般的な問題を扱っていると思います。

于 2015-05-25T10:02:14.157 に答える