1

複合コンポーネントの送信に問題があります。

私の複合コンポーネントのほとんどには、入力コンポーネントと「送信」ボタンの両方が含まれています。同じ複合コンポーネントではなく同じ h:form にボタンを配置しようとすると、送信された値がどこかで「失われた」ように見えました。たとえば、私のバリデーターは元の値で呼び出されました。

例 :

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

動作します。

しかし、 p:commandButton をコンポジットから外します:

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

動作しません。バリデーターをデバッグすると、変更された値が送信されていないことがわかります。getLocalValue、getSubmittedValue、getValue のいずれも変更されません。

この状況を修正するために使用する複合コンポーネント宣言の構文はありますか? ところで、カスタム コンポーネントではなく複合コンポーネントとしてコンポーネントを作成していたとき、バッキング Bean で #{asen} を取得するだけで機能しました。

前もって感謝します。

私は使っている :

  • プライムフェイス 3.4.1
  • CODI 1.0.5
  • OpenWebBeans 1.1.6
  • マイフェイス 2.1.9
  • トムキャット 7.0.32

(更新) この非常に奇妙な問題は、h:form のネストによって引き起こされました。

h:form のネスティングは複合コンポーネントの最初のレベルの処理に影響を与えませんでしたが、ネストされた複合でこの奇妙な「入力損失」が発生したため、非常に奇妙です。

ネスティングは次のようになります。

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

1 に答える 1

2

processの属性で相対クライアント ID を使用しています<p:commandButton>:

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

相対クライアント ID は、親NamingContainerコンポーネントに対して相対的です。コンポーネントの直接の子として検索されNamingContainerます。子自体が である場合、NamingContainerその子は検索されません。

複合コンポーネントは、それ自体がコンポーネントでもありNamingContainerます。ボタンがコンポジットに配置されている場合、これは の直接の子として検索され<cc:implementation>ます。あなたの特定のケースでは、id="mandatsTerritorial"すべての子を含め、フォーム送信時に を持つコンポーネントのみが処理されます (このコンポーネントは、これまでに投稿されたコードではどこにも表示されていませんが、簡潔にするために省略したと思います)。

ボタンが に配置されている場合、これは の直接の子<h:form>として検索されます。ただし、これは明らかにコンポジット (前述のように、別のコンポーネント) 内に配置されているため、見つからないため、基本的に何も処理されません。正しいクライアント ID を指すように修正する必要があります。例えば<h:form>NamingContainerprocess

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

このようにして、それ自体 (アクションを呼び出すために必須!) と、コンポジット with のid="mandatsTerritorial"内部にあるコンポーネントを処理します。<cc:implementation>id="mycomponent"

この特定の構成でうまく機能する完全に異なる代替手段として、process属性を完全に削除することです。デフォルトでは、フォーム全体@formを処理する alreadyに設定されています。


質問の更新に従って更新してください: ネストフォームは HTML では無効ですJSF<h:form>表現を使用しても、それは変わりません。HTML ではネストされたフォームになってしまいます。どのデータがサーバーに送信されるかについて、ブラウザの動作は規定されていません。<h:form>JSF にもネストしないようにしてください。

于 2012-11-01T02:00:39.650 に答える