Я пытаюсь использовать Dojo для публикации на моем сервере. Сервер возвращает ответ JSON (я отлаживал его и знал, что он возвращает разумное значение), но я просто получаю «Синтаксическую ошибку» в консоли Javascript, когда он возвращается. Есть идеи?xhr.post не получает ответ JSON
function submitStatusUpdate() {
dojo.xhr.post({
form:"statusUpdateForm",
handleAs: "json",
load: function(data){
alert('Saved with id ' + data.id);
},
error: function(err, ioArgs){
// again, ioArgs is useful, but not in simple cases
alert('An error occurred');
console.error(err); // display the error
}
});
}
Я также попробовал, как этот
function submitStatusUpdate() {
var posted = dojo.xhr.post({
form:"statusUpdateForm",
load: function(data){
},
error: function(err, ioArgs){
// again, ioArgs is useful, but not in simple cases
console.error(err); // display the error
}
});
posted.then(function(response){
alert('returned ' + response);
});
}
Но ответ, который печатается в моей тревоге просто кажется HTML для всей моей страницы. Я ожидаю объект JSON. Я изо всех сил пытаюсь найти простой пример, который рассказывает мне, как отправить форму, а затем функцию обратного вызова, которая читает ответ.
Благодаря
EDIT (благодаря Ричарду для руководства)
Это рабочая версия.
<script language="Javascript">
dojo.require("dijit.form.Button");
dojo.require("dijit.form.TextBox");
dojo.require("dijit.form.CheckBox");
function sendForm(){
var form = dojo.byId("myform");
dojo.connect(form, "onsubmit", function(event){
// Stop the submit event since we want to control form submission.
dojo.stopEvent(event);
// The parameters to pass to xhrPost, the form, how to handle it, and the callbacks.
// Note that there isn't a url passed. xhrPost will extract the url to call from the form's
//'action' attribute. You could also leave off the action attribute and set the url of the xhrPost object
// either should work.
var xhrArgs = {
form: dojo.byId("myform"),
load: function(data){
// As long as the server is correctly returning JSON responses, the alert will
// print out 'Form posted. ' and then the properties and values of the JSON object returned
alert("Form posted." + data);
},
error: function(error){
// We'll 404 in the demo, but that's okay. We don't have a 'postIt' service on the
// docs server.
alert("error");
}
}
// Call the asynchronous xhrPost
alert("Form being sent...");
var deferred = dojo.xhrPost(xhrArgs);
});
}
dojo.ready(sendForm);
</script>
Это (вид), как выглядит моя форма. Это будет работать в любом случае (моя реальная форма намного больше). Интересно, я должен был изменить свой обычный [тип ввода = «отправить» ...] тег в кнопку [...], чтобы заставить его работать правильно
<form method="post" id="theform" action="postIt">
<input value="Some text" name="formInput" type="text"/>
<input name="checkboxInput" type="checkbox"/>
<button id="submitButton" type="submit">Send it!</button>
</form>
А, я только что заметил что-то глупое, что я делаю. Я помещаю событие onClick, которое вызывает указанную выше функцию в кнопке отправки в форме, так что, вероятно, она будет отправлена дважды. Действие формы (url) - это http: // myserver/myapp/statusupdates/submit. Это приложение Java, и я могу вставить в него точку останова и увидеть, что она вызывается, но теперь я задаюсь вопросом, не ошибаюсь ли я в этом. Я думал, что вышеупомянутые функции были вызваны при отправке формы. Не думайте, что вы знаете хороший пример где-то подавать форму, а затем читать ответ JSON? Спасибо – Richard
Спасибо за этот пример, теперь это начинает иметь смысл. Я даю ему попробовать, ура – Richard
Получил это наконец! Вы были правы, моя конфигурация сервера была не совсем правильной: я использую Spring MVC, но у меня не было Джексона как зависимость от maven. Как только я добавил это, мой метод действительно вернул JSON обратно в функцию «load». Я использовал приведенный вами пример (первый на странице в ссылке), и теперь он отлично работает. Если вы создадите ответ на мой вопрос (а не в комментариях), я буду отмечать его как правильно, чтобы вы получили кредит. Спасибо, миллион, это меня медленно сбило с толку :) – Richard