2012-10-31 49 views
1

我在提交複合組件時遇到問題。失去在複合組件中提交的輸入

我的大多數複合組件都包含輸入組件和「提交」按鈕。 當我試圖將按鈕仍然在同一個h:表單中,但不在同一個複合組件中時,提交的值似乎在某處丟失了。而且,例如,我的驗證器被調用了原始值。

例子:

<composite:interface> 
    <composite:attribute name="titreContext" required="true"/> 
</composite:interface> 
<composite:implementation> 

    <p:outputPanel id="selectionTitreDetailsPanel" styleClass="selectionTitreDetails"> 
    <p:outputPanel id="selectionTitreDetailsPanelInner" rendered="#{not empty cc.attrs.titreContext.selected}"> 

    <p:panelGrid columns="2" id="panelId"> 
     <h:outputText id="idLabel" value="Id :"/> 
     <h:outputText id="id" value="#{cc.attrs.titreContext.selected.titeluid}"/> 
     <p:tooltip for="id" value="Identifiant unique"/> 
    </p:panelGrid> 

    <p:panelGrid columns="2" id="titelePanel"> 
     <p:outputLabel for="selectTitele" value="Titre :"/> 
     <p:selectOneMenu id="selectTitele" value="#{cc.attrs.titreContext.selected.titele}" effect="fold" styleClass="fullWidth"> 
      <f:selectItems value="#{constants.getTitelesForTypman(cc.attrs.titreContext.selected.titele.typman)}" var="titele" itemLabel="#{titele.titelelil}" itemValue="#{titele}" styleClass="fullWidth"/> 
       <p:column styleClass="fullWidth">#{titele.titelelil}</p:column> 
     </p:selectOneMenu>  
    </p:panelGrid> 

    [...] 
    <p:commandButton id="confirmerModifications" icon="small_edit" type="submit" value="Confirmer les modifications" 
        action="#{elutersEditionContext.confirmeModifsSelection}" process="mandatsTerritorial" 
        update="mandatsTerritorial #{cc.attrs.notifUpdates}"/> 

</composite:implementation> 

作品。

但把號碼:的commandButton出複合的:

<h:form> 
<mylib:mycomponent /*parameters *//> 
<p:commandButton /*parameters*/ /> 
</h:form> 

不起作用。當我調試我的驗證器時,我可以看到修改後的值甚至沒有提交。 getLocalValue,getSubmittedValue和getValue都沒有更改。

複合組件聲明中是否有語法用於糾正這種情況?順便說一下:當我將組件作爲複合組件而不是自定義組件進行編寫時,檢索輔助bean中的#{asen}剛剛工作。

在此先感謝。

我使用:

  • PrimeFaces 3.4.1
  • CODI 1.0.5
  • 的OpenWebBeans 1.1.6
  • MyFaces的2.1.9
  • 的Tomcat 7.0.32

(更新)這個非常奇怪的問題是由h:form嵌套造成的。

非常奇怪,因爲h:表單嵌套並沒有擾亂第一級複合組件的處理,但在嵌套複合中造成了這種奇怪的「輸入丟失」。

嵌套是這樣的:

<h:form> 
... 
    <p:tabView ...> 
     <p:tab> 
     <h:form> 
      <my:composite ....> 
     </h:form> 
    </p:tabView> 
</h:form> 

回答

2

你在process屬性<p:commandButton>的使用相對客戶端ID:

<p:commandButton ... process="mandatsTerritorial" /> 

的相對客戶端ID是相對父NamingContainer組件。它將被搜索爲直接子組件NamingContainer。如果孩子本身是NamingContainer,那麼它的孩子不會被搜索。

複合組件本身實際上也是NamingContainer組件。如果按鈕被放置在複合材料中,則這將被搜索爲直接<cc:implementation>。在您的特定情況下,只有id="mandatsTerritorial"組件將在形式提交處理,包括其所有兒童(注意,這部分是無處可見在目前爲止發佈的代碼,但我想象你忽略它簡潔)。

如果按鈕被放置在<h:form>,那麼這將被搜索爲直接孩子的<h:form>。然而,由於這顯然被放置在複合物(也就是說,另一個NamingContainer組件)內,所以它不會被發現,因此基本上什麼都不會被處理。您需要修復process以指向正確的客戶端ID。例如。

<h:form> 
    <mylib:mycomponent id="mycomponent" /> 
    <p:commandButton ... process="@this mycomponent:mandatsTerritorial" /> 
</h:form> 

這樣,它會處理本身(強制調用操作!)成分與id="mandatsTerritorial"複合材料的<cc:implementation>內側id="mycomponent"

作爲一個完全不同的替代方案,這會工作得很好在此特定構造,是去掉process共屬性。它默認爲@form已經將由此處理整個形式。


更新按您的問題更新:嵌套形式是HTML無效。使用JSF <h:form>表示法不會改變這一點;你仍然會以HTML格式嵌套表單。未指定瀏覽器的行爲,即將哪些數據提交給服務器。確保你不要在JSF中嵌套<h:form>

+0

我知道這不是事情是如何在堆棧溢出做,但我有我怎麼會在這裏你聯繫沒有別的想法。我今天早些時候在這裏提出了一個問題,但不幸的是它只有12個視圖。也許這是一個糟糕的時間。但我知道你會知道我的問題的答案,我真的很想找一些專業人士的見解。如果你可以花幾秒鐘閱讀我的文章,我會非常感激。謝謝主席先生http://stackoverflow.com/questions/13161747 – gmustudent

+0

@gmu:我最近沒有明確地環顧四周在JDBC和Tomcat標籤了(雖然,有時在週末只)的有最近已經「足夠」 JSF/JSP/Servlet問題來回答。 – BalusC

+0

@BalusC:謝謝你的回覆。我的問題不夠清楚。將commandButton放在組合中時,我不使用process =「​​」。由於它沒有工作,我試圖明確設置默認值@ form,以便進行處理。這不起作用。最後,你確認它應該... :-) –