Как использовать функцию как данные с jQuery ajax

Чтобы уменьшить дублированный скрипт, я создал следующий плагин, и он работает до тех пор, пока data остаются как есть.

$.fn.myValid = function(rules, options) {
    this.validate({
        rules: rules.rules,
        messages: rules.messages,
        submitHandler: function(form) {
            var o = Object.assign({},{
                type:'POST',
                url:null,
                data: $(form).serializeArray(),
                dataType: 'json',
                success: function (rsp){
                    //Instead of reloading page, do dynamicly
                    $.unblockUI();
                    alert('record submitted')
                    location.reload();
                },
                error: function (xhr) {
                    $.unblockUI();
                    alert(xhr.responseJSON.message);
                }
                }, options);
            //if (typeof o.data === "function") o.data=o.data(form);
            $.blockUI();
            $.ajax(o);
        }
    });
};

Если data нужно изменить, я не могу просто вернуть что-то вроде $(form).serializeArray().concat($('#common-inputs').serializeArray(form)) потому что form еще не определена, поэтому вместо этого я подумал возврат функции будет работать. Однако при запуске ajax data являются функцией, а не строкой, массивом или обычным объектом, поэтому данные не отправляются на сервер.

$('#help-form').myValid(validObj.common, {url:'ajax.php','data': function(form){
    console.log('this is never executed);
    return $(form).serializeArray().concat($('#common-inputs').serializeArray(form))
}});

В качестве обходного пути я включил o.data=o.data(form); (прокомментирован в приведенном выше скрипте), чтобы выполнить функцию для возврата результатов, и она работает по желанию. Я ожидаю, однако, что это скорее хак, и есть правильный способ сделать это.

Каков правильный способ использования функции в качестве данных с jQuery ajax?

Будет ли решение отличаться для других свойств, таких как url, success и т.д.?

Ответ 1

Вы можете использовать обратный вызов beforeSend для установки значения данных:

beforeSend: function( xhr, settings ) {
    this.data = $(form).serialize(); // or settings.data = $(form).serialize();
}, 

Точно так же вы можете изменить обратные вызовы URL и успешных запросов:

this.url = 'new-url';
this.success = newSuccessCallback;

Аналогичный вопрос

Обратите внимание, что это не работает для запросов GET, но POST должен работать нормально.

Ответ 2

Ваш первый вопрос: каков правильный способ использования функции в качестве данных с jQuery ajax?

Функция может использоваться для создания любых типов данных, пока вы собираетесь возвращать данные в вызове функции. Как и в jquery ajax, это будет функция обратного вызова, и вы вызываете ее каждый раз, когда вам это нужно.

# Example

function formData( form ) {
    // do anything
    return form.serialize();
}

var request = $.ajax({
    // set properties
    data: formData.call( context, form );
});

Будет ли решение отличаться для других свойств, таких как URL, успех и т.д.?

Для обратного вызова успеха используйте метод.done() или.fail() для ошибки

И URL:

function getFormURL( form ) {
    return form.attr('action');
}

url: getFormURL.call (контекст,.form);