1

次のコードがあります。

function submitHandler(dialog) {

    dialog.$submits.disableBt();
    dialog.$message.addMessage("loading", "<li>Contacting Server, please wait ...</li>");
    $.ajax({
        url: href,
        dataType: 'json',
        type: 'POST',
        data: dialog.$form.serializeArray()
    })
        .done(onSubmitDone())
        .fail(onSubmitFail());
}

この関数には、次のようなオブジェクトであるダイアログのパラメーターがあります。

{
        $modal: $modal,
        $form: $modal.find('.form'),
        $message: $modal.find('.message'),
        $submits: $modal.find('.submit-button'),
        href: $form.attr('data-href')
    };

ダイアログ オブジェクトを onSubmitDone および onSubmitFail 関数に送信する必要があります。以前は、$modal、$form などを保持するためにオブジェクトを使用していませんでした。変数はすべて、外部関数内に含まれるすべての関数で使用できました。

2 つの質問:

オブジェクトの一部として物事を渡すのは賢明ですか、それとも外部関数の先頭でこれらの変数を宣言するだけでよいでしょうか。

オブジェクトを渡す場合、次のように渡すにはどうすればよいですか。

function onSubmitDone(json) {
    json = json || {};
    if (json.Success) {
        switch (action) {

json オブジェクトが渡されることは理解していますが、ダイアログ オブジェクトも渡すにはどうすればよいですか?

4

4 に答える 4

1

ダイアログ引数を ajax コールバックに渡す 1 つの方法は、次のようにコールバック定義で囲むことです。

function submitHandler(dialog) {
    dialog.$submits.disableBt();
    dialog.$message.addMessage("loading", "<li>Contacting Server, please wait ...</li>");
    $.ajax({
        url: href,
        dataType: 'json',
        type: 'POST',
        data: dialog.$form.serializeArray(),
        success: function(data, textStatus, jqXHR) {
            onSubmitDone(data, textStatus, jqXHR, dialog);
        },
        error: function(jqXHR, textStatus, errorThrown) {
            onSubmitFail(jqXHR, textStatus, errorThrown, dialog);
        }
    });
}

すべてのコールバック引数 (data、textStatus、jqXHR、errorThrown) を明示的にしましたが、使用したくない場合はそれらすべてを使用する必要はありません。

于 2012-10-07T04:01:21.700 に答える
0

Underscore jsは、オブジェクトの処理と操作のためのユニークで本当に素晴らしいライブラリです。

オブジェクトを渡したいので、関数の外で宣言するのが賢明です。その後、オブジェクトの部分にアクセスして、関数の本体でそれらを操作できます。

コードは次のようになります。

var jsonObj;    
function submitHandler(dialog) {
        jsonObj=dialog.$form.serializeArray();
        dialog.$submits.disableBt();
        dialog.$message.addMessage("loading", "<li>Contacting Server, please wait ...</li>");
        $.ajax({
            url: href,
            dataType: 'json',
            type: 'POST',
            data:jsonObj 
        })
            .done(onSubmitDone(jsonObj))
            .fail(onSubmitFail(jsonObj));
    }
于 2012-10-07T03:59:21.433 に答える
0

オブジェクトを渡すことが賢明かどうかという質問に関しては、可能ですが、使用する必要があるときはいつでも変数を持ち歩く必要があるため、そうするのが少し面倒になるかもしれません。submitHandler() 関数の親スコープにダイアログ オブジェクトをカプセル化して、submitHandler、onSubmitDone などで使用できるようにすることをお勧めします。

2 番目の質問と、ダイアログ オブジェクトを onSubmitDone 関数にも渡す方法については、次のように応答とダイアログ オブジェクトを onSubmitDone 関数にいつでも渡すことができます。

.done(onSubmitDone(response, dialog))
于 2012-10-07T04:11:21.687 に答える
0

オブジェクトを のcontextオプションとして渡すと、内部および$.ajaxとして使用できます。thisonSubmitDoneonSubmitFail

var jsonObj; // do you really need this global?

function submitHandler(dialog) {
    jsonObj=dialog.$form.serializeArray();
    dialog.$submits.disableBt();
    dialog.$message.addMessage("loading", "<li>Contacting Server, please wait ...</li>");
    $.ajax({
        url: href,
        dataType: 'json',
        type: 'POST',
        data: jsonObj ,
        context: dialog
    })
        // Don't call the handlers from here, no ()!
        .done(onSubmitDone)
        .fail(onSubmitFail);
}

// Receives the data from the server
function onSubmitDone(response) {
    // your object is available as 'this':
    console.log(this.$modal);
}

// Different params here, but 'this' is the same
function onSubmitFail(jqXHR, textStatus) { /* ... */ }
于 2012-10-07T04:21:30.447 に答える