Отправка формы наблюдения не работает?

#tapestry

#tapestry

Вопрос:

Я несколько раз читал, что это рекомендуемый подход к добавлению обратных вызовов на стороне клиента при отправке формы, однако у меня это не работает:

 <t:form t:id="myForm" id="myForm">
    <t:submit />
</t:form>

<script type="text/javascript">
    $("myForm").observe(Tapestry.FORM_PREPARE_FOR_SUBMIT_EVENT, function() {
        alert("submitting");
    });
    alert("listening");
</script>
  

Может кто-нибудь указать, что я сделал неправильно?

Я использую tapestry 5.1.0.5

Ответ №1:

В 5.1.0.5 есть интересный дефект (исправлен в более новых версиях)

Простая страница с only не вызывает загрузку какой-либо из основных библиотек javascript tapestry (tapestry.js , prototype.js и т.д.) Таким образом, форма даже не подключается к Submit. Добавление проверки к полю в форме исправило бы это, но если у вас нет поля, это сложно.

Если у вас даже нет tapestry.js загрузка страницы затем первый шаг — убедиться, что вы делаете что-то, что укажет фреймворку, который вам нужен. Один из способов сделать это — вызвать RenderSupport#addScript. Передача пустой строки игнорируется, поэтому вы можете вставить в нее точку с запятой, чтобы, по сути, получить отказ от операции.

 @Inject
private RenderSupport renderSupport;

void setupRender() {
    // non-blank addScript causes stack to get added
    renderSupport.addScript(";");
}
  

Следующее, что нужно сделать, это вызвать getFormEventManager в вашем элементе формы, чтобы инициализировать форму для tapestry, и убедиться, что обработчики событий подключены.

Я также обновил TML, чтобы дождаться загрузки dom, чтобы вы не получали странных ошибок синхронизации:

 <t:form t:id="myForm">
   <t:submit/>
</t:form>

<script type="text/javascript">
    Tapestry.onDOMLoaded(function() {
    $('myForm').getFormEventManager(); // forces the form to start listening for submits
    $("myForm").observe(Tapestry.FORM_PREPARE_FOR_SUBMIT_EVENT, function() {
       alert("submitting");
    });
    alert("Dom loaded");
  });
</script>
  

Неприятно, но исправлено в более поздних версиях фреймворка.