Как использовать функцию как данные с 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);