Как синхронизировать a4j: jsFunction и actionListener в Jsf - PullRequest
0 голосов
/ 13 октября 2010

У меня следующий код для выполнения, но он дает некоторые проблемы, связанные с AJAX-запросом.

actionListener Call on Button Click

<a4j:commandButton value="Submit" alt="OligoWalk" styleClass="common_button" onclick="createNewLog();showProgressLayer();" oncomplete="parent.document.getElementById('resultFrm').src ='#{MyResearchView.resultToShow}';parent.reRenderLogSection();" actionListener="#{MyResearchView.executeTool}">        <f:attribute name="toolClass" value="com.sequerome.service.impl.tools.Oligowalk" />
<f:attribute name="toolId" value="#{ToolCustomeFormView.toolId}" />   <f:attribute name="toolName" value="#{ToolCustomeFormView.toolName}" />                    <f:attribute name="inputParamFile" value="#{ToolCustomeFormView.inputParamFile}" />
<f:attribute name="paramMap" value="#{ToolCustomeFormView.toolParamBean.paramMap}" />
</a4j:commandButton>

A4j: jsFunction

<a4j:jsFunction name="createNewLog"
   actionListener="#{MyResearchView.createNewLogEntry}"
   oncomplete="parent.reRenderLogSection();executeTool();">
   <f:attribute name="toolId" value="#{ToolCustomeFormView.toolId}" />
   <f:attribute name="toolName" value="#{ToolCustomeFormView.toolName}"/></a4j:jsFunction>
  1. Функция createNewLog () должна завершиться сначала
  2. Функция executeTool () должна завершиться после этого.

В настоящее время он вызывается таким же образом, но сначала выполняется половина функции createNewLog (), а затем - функция executeTool (). Здесь для выполнения требуется некоторый код, и он снова движется к функции createNewlog (). После этого выполняется createNewLog (), затем снова выполняется executeTool ().

<a4j:commandButton value="Submit" alt="OligoWalk" styleClass="common_button" onclick="createNewLog();showProgressLayer();" oncomplete="parent.document.getElementById('resultFrm').src ='#{MyResearchView.resultToShow}';parent.reRenderLogSection();" actionListener="#{MyResearchView.executeTool}">        <f:attribute name="toolClass" value="com.sequerome.service.impl.tools.Oligowalk" />
<f:attribute name="toolId" value="#{ToolCustomeFormView.toolId}" />   <f:attribute name="toolName" value="#{ToolCustomeFormView.toolName}" />                    <f:attribute name="inputParamFile" value="#{ToolCustomeFormView.inputParamFile}" />
<f:attribute name="paramMap" value="#{ToolCustomeFormView.toolParamBean.paramMap}" />
</a4j:commandButton>

<a4j:jsFunction name="createNewLog"
   actionListener="#{MyResearchView.createNewLogEntry}"
   oncomplete="parent.reRenderLogSection();executeTool();">
   <f:attribute name="toolId" value="#{ToolCustomeFormView.toolId}" />
   <f:attribute name="toolName" value="#{ToolCustomeFormView.toolName}"/></a4j:jsFunction>

Ответы [ 2 ]

0 голосов
/ 10 августа 2011

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

  • createNewLog ();
    • вызывает a4j: функцию
    • a4j: функция отправляет запрос
    • a4j: функция возвращает (запрос все еще выполняется)
  • showProgressLayer ();
    • вызывает a4j: функция
    • a4j: fucntion отправляет запрос (запрос createNewLog выполняется наполовину)
    • a4j: функция возвращает (запрос все еще выполняется)
  • запрос actionListener запущен
    • запрос выполняется на сервере, возможно, пока еще работают createNewLog и showProgressLayer

Решением может быть добавление очередей на стороне клиента и синхронизации на стороне сервера.

0 голосов
/ 04 декабря 2010

не уверен, к чему ты клонишь. Некоторый код поможет. Для функции a4j: jsFunction существует событие javascript с именем oncomplete. Я полагаю, один из подходов заключается в вызове других функций js при получении этого события ...

...