0

実行用の次のコードがありますが、ajax リクエストに関連する問題が発生しています。

ボタンクリック時の actionListener 呼び出し

<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:js関数

<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>
4

2 に答える 2

0

ここで何を目指しているのかわからない。いくつかのコードが役立ちます。a4j:jsFunction の oncomplete という JavaScript イベントがあります。このイベントが受信されたときに他の js 関数を呼び出すことが 1 つのアプローチだと思います...

于 2010-12-04T13:34:55.190 に答える
0

この症状は、a4j:function が非同期関数であることが原因である可能性があります。舞台裏で起こっていることは次のとおりだと思います。

  • createNewLog();
    • a4j:関数を呼び出します
    • a4j:関数はリクエストを送信します
    • a4j:function が返されます (リクエストはまだ発生しています)
  • showProgressLayer();
    • a4j:関数を呼び出します
    • a4j:fucntion がリクエストを送信します (createNewLog リクエストはたまたま途中で完了しました)
    • a4j:function が返されます (リクエストはまだ発生しています)
  • actionListener リクエストが発生します
    • おそらく createNewLog と showProgressLayer がまだ実行されている間に、リクエストがサーバーで実行されます

解決策は、クライアント側にキューを追加し、サーバー側に同期を追加することです。

于 2011-08-10T18:04:30.280 に答える