ui:在TabView中包含:首先在tab中的ajax调用不会触发(commandButton动作)

时间:2013-03-07 14:05:38

标签: ajax jsf action actionlistener tabview

下面的代码是tabView,后面是加载页面的结构。对于commandButton,我尝试了actionListener,显式引用目标inputtextarea(req)的渲染和更新的不同组合等。当表单在其自己的页面中运行时(不在选项卡中),该操作正常工作。

在“preRenderView”事件中,我初始化数据结构,这些数据结构在表单显示时填充。问题是当我点击预览按钮时。通常动作触发,处理方法组装数据以在预览inputextarea(req)中显示,并显示。

奇怪的是,当我单击按钮时,操作不会被调用,尽管有活动调用我的其他选项卡的loadReqEvents,并且在托管tabView的外部页面中。我怀疑这是JSF的请求 - 响应细微差别,我不知道。谢谢你的帮助。

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

1 个答案:

答案 0 :(得分:0)

如果没有看到声明组件req的位置的标记,我认为它存在于ui:include中指定的一个xhtml文件中。

问题是render的{​​{1}}属性指定了页面上不存在的id。这样做的原因是组件客户端ID将以其父f:ajax的客户端ID为前缀。

并非所有JSF组件都是UINamingContainer,UINamingContainer肯定是为什么您通常会看到前缀为组件的客户端ID的表单的ID。例如:

form

在上面的示例中,<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> 的客户端ID实际上是textComponent。现在,上面示例中的命令按钮仍然可以通过其实际ID引用它,因为它恰好与其同级组件位于同一formone:textComponent

但是,另一种形式的commandButton必须通过其完整的客户端ID访问它,因为它不是UINamingContainer的兄弟。它通过在客户端ID前加上通用选择器textComponent前缀,然后使用:的整个客户端ID进行操作来实现此目的。

现在这与你的问题有什么关系?

PrimeFaces TabView组件也恰好是textComponent

这意味着要向Ajax呈现ID为UINamingContainer的组件,您需要为表单指定一个ID并以这种方式调用它...

req

我希望这是有道理的。