У меня есть представление магистрали с некоторой проверкой формы. Проверка формы использует preventDefault, если в форме есть ошибки. Если это не так, он должен принять значение в поле ввода, получить lat, lng и заполнить два скрытых поля, прежде чем продолжить отправку. Я пытаюсь использовать отложенный, но не уверен, что я ошибся. Я вырезал некоторые ненужные фрагменты здесь и там, чтобы было чище размещать здесь.
Я пробовал использовать preventDefault с отложенным (которое мне все равно не нужно было исправлять?), но повторная отправка с использованием события отправки представляет собой некоторую проблему.
Без preventdefault поля lat, lng не обновляются перед отправкой. Возможно, неправильная реализация deferred/promise или при использовании preventdefault отправка снова запускает проверку, и я попадаю в цикл. Я не хочу использовать setTimeout, потому что не хочу задерживать пользователя дольше, чем получить ответ.
events: {
'submit': 'validateForm'
},
validateForm: function(e){
//lotsa validation then
var loc = $('#location').length;
if ( loc ){
var parent = $(e.currentTarget).closest('form');
e.preventDefault();
$.when(this.getCoordinates(e))
.done(function(){
parent.submit();
});
}
},
getCoordinates : function(e) {
var deferred = $.Deferred();
var that = this;
var parent = $(e.currentTarget).closest('form');
var addr = parent.find('#location').val();
if ($.trim(addr).length) {
var apiurl = '//maps.googleapis.com/maps/api/geocode/json?address=' + addr '&bounds=' + bounds + '';
$.ajax({
url : apiurl,
dataType : 'json'
})
.done(function (data) {
try {
if(!data.results.length){
return;
}
var coord = data.results[0].geometry.location;
var result = data.results[0].formatted_address;
if (coord) {
var lat = coord.lat;
var lon = coord.lng;
parent.find("input[data-geo-type = 'lat']").val(lat);
parent.find("input[data-geo-type = 'lng']").val(lon);
deferred.resolve();
}
} catch (e) {
console.error(e);
}
}).fail(function () {
$(e.currentTarget).val(addr);
});
} else {
deferred.reject();
}
return deferred.promise();
},
Любая помощь или указатели приветствуются!
validateForm
не запускает отправку формы? или что-то другое? Что здесь делаетsubmitCoordinates
? - person T J   schedule 08.04.2016submitCoordinates()
илиgetCoordinates()
? Также фигурные скобки не сбалансированы. Исправьте вопрос, может кто ответит. - person Roamer-1888   schedule 08.04.2016$.trim(addr).length
ложно. - person Kevin B   schedule 08.04.2016parent.submit()
повторно инициирует событие отправки, что может привести к бесконечному циклу. Вы испытываете бесконечный цикл? (вы увидите, что он постоянно получает координаты от Google на вкладке вашей сети) - person Kevin B   schedule 08.04.2016form.submit()
намеренно не запускает событие отправки формы именно по этой причине. Так было с самых первых дней HTML/javascript. - person Roamer-1888   schedule 08.04.2016e.currentTarget
было бы адресным полем только в том случае, если быvalidateForm()
вызывалось особым образом. - person Roamer-1888   schedule 08.04.2016.submit()
на[0].submit()
. это позволит вам обойти любые связанные события и вместо этого просто выполнить действие. - person Kevin B   schedule 08.04.2016.submit()
для объекта jquery, как здесь. Вместо этого jQuery вызовет событие, и только после того, как все события будут запущены, он отправит его и только в том случае, если ни одно из событий не вернуло false или не предотвратило значение по умолчанию. - person Kevin B   schedule 08.04.2016