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} 就可以了。

提前致谢。

我在用 :

  • PrimeFaces 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。如果孩子本身是 a 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"内部的组件 with 。<cc:implementation>id="mycomponent"

作为一个完全不同的替代方案,在这个特定的结构中工作得很好,就是process完全删除该属性。它默认为@form已经处理整个表单。


根据您的问题更新进行更新:嵌套表单在 HTML 中无效使用 JSF<h:form>表示不会改变这一点。您仍然会在 HTML 中使用嵌套表单。浏览器行为未指定将哪些数据提交给服务器。确保您也没有嵌套<h:form>在 JSF 中。

于 2012-11-01T02:00:39.650 回答