Я работаю с PHP на бэкэнде с микрорамкой Slim, если это будет актуально.
Ну, проблема в том, что форма очищается после отправки. Сервер возвращает код ошибки, в случае ошибки, конечно, и сообщение об ошибке показывается пользователю, но поля чистые.
Я должен упомянуть, что я использую плагин jquery-validation.
HTML
<form action="{{ path_for('save_data') }}" method="POST" id="myForm" name="myForm" data-bind="submit: sendForm">
<input type="text" name="foo" data-bind="value: foo" required>
<button type="submit">Save data</button>
</form>
Javascript / Knockout JS
function MyView($) {
var self = this;
self.foo = ko.observable();
/* ... code ... */
self.sendForm = function(theForm) {
if (!$(theForm).valid()) {
return;
}
$.post(theForm.action, ko.toJS(self.foo), function(response) {
alert(response);
})
.fail(function(failResponse) {
alert(failResponse);
});
};
}
ko.applyBindigs(new MyView(jQuery));
Просто для лучшего понимания серверный код выглядит примерно так:
public function postSaveData($request, $response) {
if (TRUE) { // Some validations here
return $response->withJson("Error message", 400);
}
// save
return $response->withJson("OK", 200);
}
ОБНОВИТЬ
После некоторых тестов мне приходит в голову тестировать с чистым кодом javascript, без jQuery. Вроде как:
self.sendForm = function(theForm) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
console.log("Response text: ", xhttp.responseText);
}
else if (this.status == 400) {
console.log("Response text: ", xhttp.responseText);
}
};
xhttp.open("POST", formElement.action, true);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.send(ko.toJS(self.imovel));
};
И вуаля! Форма отлично заполнена, как и прежде, чем отправлять данные. Каким-то образом пост jQuery очищает форму.
Задача ещё не решена.
Других решений пока нет …