1

次のコードがあります。

  function submitHandler($link, $modal, close) {

    var $form = $modal.find('#main-form');
    var $submitBt = $modal.find('.block-footer button:contains("Submit")');
    var oSubmit = {
        $form: $form,
        $modal: $modal,
        action: $form.attr('data-action'),
        entity: $form.attr('data-entity'),
        href:   $form.attr('data-href'),
        row: $link.attr('data-row'),
        $row: $('#row_' + $link.attr('data-row')),
        $submitBt: $submitBt
    };

    if (!$form.valid || $form.valid()) {
        $submitBt.disableBt();
        $modal.removeBlockMessages()
            .blockMessage('Contacting Server, please wait ... ', { type: 'loading' });
        $.ajax({
            url: oSubmit.href,
            dataType: 'json',
            type: 'POST',
            data: $form.serializeArray()
        })
        .done(function (json, textStatus, XMLHttpRequest) {
            json = json || {};
            if (json.success) {
                submitSuccessModal(oSubmit, json);
                if (close == true) {
                    $modal.closeModal();
                    if (oSubmit.action == "Create") {
                        $('#createLink').prop('disabled', false);
                    }
                }
            } else {
                submitFailModal(oSubmit, json);
            }
        })
        .fail(function (XMLHttpRequest, textStatus, errorThrown) {
            setTimeout(function () {
                $modal
                    .removeBlockMessages()
                    .blockMessage('Could not contact server, please try again', { type: 'error' });
                $submitBt.enableBt();
            }, 1000);
            return false;
        });
    };
};

機能を $.ajax から「完了」用の関数と「失敗」用の別の関数に移動する最良の方法は何ですか。また、これらの関数にどのパラメータを渡す必要がありますか? 私が最も混乱しているのは、コードの先頭で宣言した変数をどうすればよいかということだと思います。.done のように、これらを外部関数にも渡す必要があります。それらのいくつかを参照します。

4

3 に答える 3

2

今しなければならないことは、無名関数として知られているものを利用します。無名関数 (名前のない関数) への参照をdoneandfail関数に渡します。

コードを整理する (またはこれらの関数を他のコードと共有できるようにする) には、これらの関数に名前を付けてajax()呼び出しの外に移動するだけで済みます。これらをonDoneと と呼びonFailますが、もちろん意味のある名前を付けることもできます。

呼び出された関数の戻り値ではなく、関数オブジェクト自体を参照しているため、括弧なしでそれらを参照していることに注意してください。

  function onDone(json, textStatus, XMLHttpRequest) {
       json = json || {};
       if (json.success) {
           submitSuccessModal(oSubmit, json);
           if (close == true) {
               $modal.closeModal();
               if (oSubmit.action == "Create") {
                   $('#createLink').prop('disabled', false);
               }
           }
       } else {
           submitFailModal(oSubmit, json);
       }
   }

   function onFail(XMLHttpRequest, textStatus, errorThrown) {
       setTimeout(function () {
           $modal
               .removeBlockMessages()
               .blockMessage('Could not contact server, please try again', { type: 'error' });
           $submitBt.enableBt();
       }, 1000);
       return false;
   }

   $.ajax({
       url: oSubmit.href,
       dataType: 'json',
       type: 'POST',
       data: $form.serializeArray()
   })
   .done(onDone) //Reference to onDone, without parenthesis
   .fail(onFail);
于 2012-09-17T06:44:04.907 に答える
0

done()とはすでに匿名関数をパラメータとして取っているためfail()、これらの関数を別の場所で宣言してから、名前で参照することができます。

var doneFunction = function (json, textStatus, XMLHttpRequest) {
...
};

var failFunction = function (XMLHttpRequest, textStatus, errorThrown) {
...
};

$.ajax({
        url: oSubmit.href,
        dataType: 'json',
        type: 'POST',
        data: $form.serializeArray()
    })
    .done(doneFunction)
    .fail(failFunction);
于 2012-09-17T06:44:49.800 に答える
0

これはどう:

var ajax_functions = {};
ajax_functions.success = function(json, textStatus, XMLHttpRequest) {
    // code
};

ajax_functions.error = function(XMLHttpRequest, textStatus, errorThrown) {
    // code
};

$.ajax({
    url: oSubmit.href,
    dataType: 'json',
    type: 'POST',
    data: $form.serializeArray(),
    success: ajax_functions.success,
    error: ajax_functions.error
});
于 2012-09-17T06:45:10.720 に答える