0

jQuery Dialog内のフォームを使用していますが、投稿するデータに問題があります。最初のロードと保存は正常に機能し、正しいデータを投稿します。ただし、ページを更新するまでは、正しいデータがフォームにあるため、後続のすべての読み込みは機能しているように見えますが、保存すると、最初の読み込みのデータが毎回投稿されます。

function formdialog(url, tack, divid, scriptload){
    $.getJSON(url+tack+"/form", function(data){
        var formwin = '<div><form id="formdialog">'+data['form']+'</form></div>';
        var dialog = $(formwin).dialog({
            title: data['title'],
            autoOpen: false,
            modal: true,
            buttons: {
                "Save": function(){    
                    $.post(url+tack+"/process", 
                        $("#formdialog").serialize(),
                        function(data){
                            alert($("#formdialog").serialize());
                            $(this).dialog('close');
                            $(this).remove();
                        }
                    );
                },
                "Cancel": function(){$(this).dialog('close'); $(this).remove();}
            }
        });

        dialog.dialog("open");
    });
}

$(function(){        
    $("a.edlnk").click(function(){
        var url = $(this).attr("href");
        formdialog(CONFIG_HREF_SITE+"ajax/"+appControl, "/"+url, divid);
        return false;
    });
});
4

1 に答える 1

2

問題は

$(this).dialog('close');
$(this).remove();

...postコールバックのコンテキストを指定していないため、コールバックで。その場合、をこれに変更するpostと修正されます。

$.ajax({
    url:        url+tack+"/process",
    type:       'POST',
    data:       $("#formdialog").serialize(),
    context:    this,
    success:    function(data){
        alert($("#formdialog").serialize());
        $(this).dialog('close');
        $(this).remove();
    }
});

...関数が呼び出されthisたときの意味を保持しているためです。success

では、なぜその問題があなたが見ている振る舞いを引き起こすのでしょうか?formwin divを削除しない場合は、を削除しないためです。つまり、同じIDを持つページにformdialog form複数のが表示されることになります。form複数の要素に同じIDを設定することは無効であるため、未定義の動作が発生する可能性がありますが、ほとんどのブラウザは、IDで要素を要求すると、最初に一致する要素を提供します。この場合、以前のデータを含む以前の形式になります。


あなたのコメントを編集してください:ええ、私はちょっと$(this).dialog('close')そこを逃しました。:-)いくつかのオプション:1つは$(formwin)、ローカル変数で記憶し、それをコールバックで使用することです。例:

var formwin = '<div><form id="formdialog">'+data['form']+'</form></div>';
var formwinElement = $(formwin);     // <== Remember it here
var dialog = formwinElement.dialog({ // <== Use it here

// ...

                $.post(url+tack+"/process", 
                    $("#formdialog").serialize(),
                    function(data){
                        alert($("#formdialog").serialize());
                        $(this).dialog('close');
                        formWinElement.remove(); // <== And again here
                    }
                );

context...そしてパラメータを気にしないでください(したがって、$.postこのアップデートではオリジナルを使用しています)。post成功ハンドラーはformwinElement変数(および他のいくつかのもの)のクロージャーであるため、これは機能します。

于 2010-06-02T14:11:58.403 に答える