вызывающий ColdFusion.Ajax.submitform () несколько раз в функции jQuery - PullRequest
1 голос
/ 23 февраля 2011

У меня есть страница с несколькими формами. Затем у меня есть кнопка, к которой прикреплен обработчик события щелчка jQuery, который вызывает ColdFusion.Ajax.submitform () для каждой формы. Моя проблема в том, что submitform () работает только для некоторых форм на странице. Остальные формы не сохраняются. Примечание: я могу сохранить все формы по отдельности, поэтому я знаю, что это не проблема с моим кодом "действия формы".

<script type="text/javascript">
    $(function() {
        $("#saveAll").click(function() {
            ColdFusion.Ajax.submitForm( 'form1', 'multipleforms.cfm' );
            ColdFusion.Ajax.submitForm( 'form2', 'multipleforms.cfm' );
            ColdFusion.Ajax.submitForm( 'form3', 'multipleforms.cfm' );
            ColdFusion.Ajax.submitForm( 'form4', 'multipleforms.cfm' );
            ColdFusion.Ajax.submitForm( 'form5', 'multipleforms.cfm' );
            ColdFusion.Ajax.submitForm( 'form6', 'multipleforms.cfm' );
            ColdFusion.Ajax.submitForm( 'form7', 'multipleforms.cfm' );
        });
    });

    location.href = 'http://localhost/multipleforms.cfm';
</script>

Когда я удалил строку location.href, все формы были сохранены. Кто-нибудь знает, почему эта строка приведет к тому, что не все формы будут сохранены? Причина здесь: location.href, потому что я хотел бы обновить страницу, чтобы пользователь мог видеть данные, которые зависят от значений, которые они выбрали в форме; и я не хочу использовать location.reload (), потому что он всегда создает всплывающее окно, подтверждающее перезагрузку. Также отметим, что я стараюсь не использовать одну большую форму для сохранения данных формы.

Спасибо.

Ответы [ 4 ]

2 голосов
/ 23 февраля 2011

Проблема здесь в A в Ajax. Вы асинхронно отправляете семь форм, но каждая отправка может вернуться в любое время и в любом порядке. Что произойдет, если форма пять займет минуту, чтобы вернуться, потому что сервер остановлен?

Другая проблема, с которой вы столкнетесь, заключается в том, что браузеры обычно разрешают от двух до шести одновременных запросов, поэтому, несмотря на асинхронный характер вызовов, браузер может зависнуть в ожидании соединения.

Если ваше приложение зависит от одновременной отправки ajax семи форм, одним из вариантов будет попытка провести рефакторинг приложения, чтобы вы выполняли одну отправку ajax с динамическими параметрами, выбранными из всех рассматриваемых форм.

Если это невозможно, другой подход состоял бы в том, чтобы объединить семь запросов, при этом каждый запрос вызывался в обратном вызове его предшественника. Примерно так:

 ColdFusion.Ajax.submitForm( 'form1', 'multipleforms.cfm', function(){
   ColdFusion.Ajax.submitForm( 'form2', 'multipleforms.cfm', function(){
     ColdFusion.Ajax.submitForm( 'form3', 'multipleforms.cfm', function(){
       // etc
     });
   });
 });

Здесь у нас есть каскад представлений, каждый из которых срабатывает, когда предыдущий завершен. Если ваше перенаправление не может произойти до тех пор, пока не будет отправлено form7, это перенаправление будет внутри обратного вызова последней отправки:

 // forms 1 through 6, then inside the callback of form6:
 ColdFusion.Ajax.submitForm( 'form7', 'multipleforms.cfm', function(){
   location.replace('http://localhost/multipleforms.cfm'); // fires last
 });

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

Последний вариант более грубой силы - синхронные вызовы . Проверьте аргумент asynch . Конечно, это приведет к остановке перед перенаправлением, поэтому рефакторинг, вероятно, лучший вариант с точки зрения взаимодействия с пользователем.

0 голосов
/ 23 февраля 2011

Я бы написал это как комментарий, но это слишком долго.

Чтобы очистить код Кена и Дэна, вы можете написать следующий скрипт

(function(){
     var valueArray = split(commaSeparatedValueList,",");
     for(var i=0; i<valueArray.length; i++){
          if((i+1) < 7)last = false;
          else last = true;
          submitForm('form'+(i+1), last);
     }
});
function submitForm(formid,last){
     ColdFusion.Ajax.submitForm(formId=formid, URL='multipleforms.cfm',asynch=false, callback=function(){
          if(last)location.href = 'http://localhost/multipleforms.cfm';
     });
}

Я не являюсь мастером JavaScript, но в теории это должно сработать. Он отправляет форму синхронно, так что вам не нужно беспокоиться о том, что кто-то зависнет.

0 голосов
/ 23 февраля 2011

Можно установить для атрибута asynch значение false, чтобы предотвратить асинхронную отправку.

В качестве альтернативы, если вы использовали обычную отправку jQuery ajax, вы можете использовать настройку complete, чтобы гарантировать только последующую отправку формпроизойдет, как только предыдущий завершится успешно

0 голосов
/ 23 февраля 2011

Я не уверен на 100%, но я думаю, что это может быть связано с тем, что submitForm происходит через асинхронный запрос, поэтому ваш файл location.href происходит до того, как все формы фактически отправлены и обработаны. Попробуйте изменить строку location.href на эту и поместить ее в объявление click, чтобы оно происходило после последнего вызова submitForm:

ColdFusion.Ajax.submitForm( 'form7', 'multipleforms.cfm' );
window.setTimeout(function(){
    location.href = 'http://localhost/multipleforms.cfm';
}, 0);

Это должно предотвратить запуск location.href до того, как будут обработаны все предыдущие события.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...