1

The code below is the tabView, followed by the structure of the loaded page. For the commandButton, I have tried actionListener, different combinations of render and update referencing the target inputtextarea (req) explicitly, etc. The action works fine when the form runs in its own page (not within a tab).

In the "preRenderView" event, I initialize data structures, which are populated when the form displays. Problem is when I click on the Preview button. Normally the action fires, the handling method assembles the data for display in the preview inputextarea (req), and it's displayed.

Strangely, when I click the button, the action is NOT called, although there is activity calling my other tabs' loadReqEvents, and in the outer page hosting the tabView. I suspect this is a request-response nuance of JSF that I'm unaware of. Thanks for help.

<p:tabView id="tbv" dynamic= "true" activeIndex="#{sessionController.activeTab}" styleClass="tabview-style">       
  <p:tab id="rtmTab" styleClass="tab-style" title="RTM" closable="false" titletip="Requirements Traceability Matrix">
      <ui:include src="url(./../rtm.xhtml"/>
   </p:tab>
   <p:tab id="composeTab" styleClass="tab-style" title="#{sessionController.composeTabTitle}" rendered="#{sessionController.crudTabRendered}" closable="false" titletip="Composition Form">
      <ui:include src="url(./..#{sessionController.composeUrl}.xhtml"/>
   </p:tab>
   <p:tab id="objTab" styleClass="tab-style" title="Object / Data Model" closable="false" titletip="Object and Data Model View">
      <ui:include src="url(./../objView.xhtml"/>
   </p:tab>
</p:tabView>  
</p:layoutUnit>


<p:layoutUnit id="formLayout" position="center" gutter="0" styleClass="form-layout"> 
  <h:form>
    <f:event listener="#{attrDefController.loadReqEvent}" type="preRenderView"></f:event>  
    <p:panel style="background-color:rgb(222,231,254);width:925px;height:98%;margin-top:-4px;margin-left:-8px">
      <h:panelGrid columns="7" style="margin-right:-8px" cellpadding="2">
          <h:commandButton id="preview" value="Preview" action="#{attrDefController.previewReqAction}" style="width:100px; margin-top:2px">
             <f:ajax execute="@form" render="req"/>
          </h:commandButton>
       </h:panelGrid>
     </p:panel>
   </h:form>
 </p:layoutUnit>
4

1 に答える 1

0

reqコンポーネントが宣言されている場所のマークアップを確認せずに、 ui:include.

問題は、 のrender属性がf:ajaxページに存在しない ID を指定していることです。これは、コンポーネントのクライアント ID の前に親のクライアント ID が付けられるためですUINamingContainer

すべての JSF コンポーネントが UINamingContainer でformあるとは限りません。これが、通常、コンポーネントのクライアント ID の前にフォームの ID が表示される理由です。例えば:

<h:form id="formone">
  <h:outputText id="textComponent" value="YO" />
  <h:commandButton ...>
    <f:ajax update="textComponent" />
  </h:commandButton>
</h:form>
<h:form id="formtwo">
  <h:commandButton ...>
    <f:ajax update=":formone:textComponent" />
  </h:commandButton>
</h:form>

上記の例では、 のクライアント IDtextComponentは実際にはformone:textComponentです。上記の例のコマンド ボタンは、たまたまUINamingContainer兄弟コンポーネントと同じであるため、実際の ID で参照できます。

ただし、他のフォームの commandButton は、 の兄弟ではないため、完全なクライアント ID でアクセスする必要がありますtextComponent。これは、クライアント ID の前にユニバーサル セレクター:を付け、その後にtextComponent.

これはあなたの問題と何の関係がありますか?

PrimeFaces TabView コンポーネントUINamingContainerも同様です。

つまり、ID を使用してコンポーネントを Ajax でレンダリングするにはreq、フォームの ID を指定して、この方法で呼び出す必要があります...

render=":formid:tbv:req"

これが理にかなっていることを願っています。

于 2013-03-07T14:41:12.227 に答える