0
function checkname(o) {
    var o = $('#log').val();                
    $.ajax({
        url: 'check_name',
        type: 'POST',
        data: 'username=' + o,
        success: function(o){
            if(o == 1) {
                 return o;
            }
            else {
                 o.addClass( "ui-state-error" );
         updateTips( "not available" );
         return false; 
            }
        }
  });
}

チェックするモデルのフォームに関連するこの機能が使用可能かどうか

$( "#dialog-form" ).dialog({
     autoOpen: false,
     height: 600,
     width: 550,
     modal: true,
     buttons: {
    "save": function() {
        var bValid = true;
        allFields.removeClass( "ui-state-error" );

        bValid = bValid && checkname ( name, "name");


        if ( bValid ) {
                $.ajax({
            type: 'POST',
            url: 'add_user',
            data: $('#myform :input').serialize(),

            success: function(i) {
                alert('sucess');
                            window.setTimeout(function(){location.reload()},500)

            }
        });
        $( this ).dialog( "close" );
    }
    },
    Cancel: function() {
    $( this ).dialog( "close" );
    }
   },
   close: function() {
     allFields.val( "" ).removeClass( "ui-state-error" );
   }
});

フォームの保存をクリックすると、フォームが保存されないか、firebug return 1でのみ閉じられません

名前が利用可能な場合は保存フォームが必要です

4

2 に答える 2

1

checknameAJAX 呼び出しは非同期であるため、成功コールバックから関数を返すことによって関数から何かを返すことはできません。

結果を処理するには、コールバック メソッドを使用します。

function checkname(o, whenValid) {
  var o = $('#log').val();
  $.ajax({
    url: 'check_name',
    type: 'POST',
    data: 'username=' + o,
    success: function (o) {
      if (o == 1) {
        whenValid();
      } else {
        o.addClass("ui-state-error");
        updateTips("not available");
      }
    }
  });
}

$("#dialog-form").dialog({
  autoOpen: false,
  height: 600,
  width: 550,
  modal: true,
  buttons: {
    "save": function () {
      allFields.removeClass("ui-state-error");

      checkname(name, function(){

            $.ajax({
                type: 'POST',
                url: 'add_user',
                data: $('#myform :input').serialize(),

                success: function (i) {
                    alert('sucess');
                    window.setTimeout(function () {
                        location.reload()
                    }, 500)

                }
            });
            $(this).dialog("close");

      });


    },
    Cancel: function () {
        $(this).dialog("close");
    }
  },
  close: function () {
    allFields.val("").removeClass("ui-state-error");
  }
});
于 2013-02-26T08:08:37.923 に答える
0

最初の ajax 関数では、success 関数のスコープ内から戻りますが、checkname 関数は何も返しません。あったとしても、ajax は非同期であるため、返されたデータの値を返すことは機能しません。

データの使用を開始する前に、ajax 呼び出しが完了するのを待つ必要があります。次のように、ajax 関数からの遅延リターンを使用してそれを行います。

function checkname(name) {
    return $.ajax({
        url: 'check_name',
        type: 'POST',
        data: {username : name}
    });
}

そして、次のように使用します:

$("#dialog-form").dialog({
    autoOpen: false,
    height: 600,
    width: 550,
    modal: true,
    buttons: {
        save: function () {
            allFields.removeClass("ui-state-error");
             //whatever "name" is ?
            checkname($('#log').val()).done(function(data) {
                if (data==1) {
                    $.ajax({
                        type: 'POST',
                        url: 'add_user',
                        data: $('#myform :input').serialize()
                    }).done(function(data2) {
                        //why use ajax only to reload the page ?
                        alert('sucess');
                        window.setTimeout(function () {
                            location.reload();
                        }, 500);
                    });
                    $(this).dialog("close");
                }
            });
        },
        Cancel: function () {
            $(this).dialog("close");
        }
    },
    close: function () {
        allFields.val("").removeClass("ui-state-error");
    }
});

また、どこでも同じ変数を使用しているようです。checkname 関数のパラメーターは でo、関数内には という新しい変数があり、それをajax 関数でo使用していますが、もう少し工夫を凝らす必要がありますか?o

于 2013-02-26T08:11:21.323 に答える