当前位置: 首页 > 知识库问答 >
问题:

丢失在复合组件中提交的输入

骆昊阳
2023-03-14

我在提交复合组件方面有问题。

我的大多数复合组件都包含输入组件和“提交”按钮。当我试图将按钮仍然放在相同的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>
<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:Form嵌套没有扰动复合组件第一层的处理,而是在嵌套复合中造成了这种奇怪的“输入丢失”。

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

共有1个答案

申高峯
2023-03-14

您正在 process属性中使用相对客户端ID:

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

相对客户端ID相对于父namingcontainer组件。它将作为NamingContainer组件的直接子级进行搜索。如果子级本身是namingcontainer,则不会搜索它的子级。

复合组件本身实际上也是namingcontainer组件。如果该按钮被放置在组合中,则将作为 的直接子项进行搜索。在您的特定情况下,只有带有id=“mandatsterrgative”的组件才会在表单提交时被处理,包括它的所有子组件(注意,到目前为止发布的代码中看不到这个组件,但我想您为了简洁而省略了它)。

如果按钮放置在 中,则该按钮将作为 的直接子级进行搜索。但是,由于它显然被放置在复合组件中(如前所述,这是另一个namingcontainer组件),因此不会找到它,因此基本上不会处理任何东西。您需要修复process以指向正确的客户端ID。例如。

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

这样它就会处理自己(强制调用该操作!)以及具有id=“MyComponent”的组合的 中的具有 id=“MyComponent”的组件。

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

根据您的问题更新:嵌套表单在HTML中无效。使用JSF 表示方式不会改变这一点;您最终仍然会使用HTML中的嵌套表单。对于哪些数据将提交给服务器,浏览器的行为未指定。请确保您没有在JSF中嵌套

 类似资料:
  • Vue.js新手,尝试在表示表单的组件中处理提交事件,该表单将检查子组件的有效性,并在一切正常的情况下将处理传递给父组件中的事件处理程序。 我得到这个错误。。。[Vue warn]:v-on处理程序中的错误:“TypeError:undefined不是在中找到的对象(计算“$event.preventDefault”)”--- 子组件是MyForm。。。 父组件(应用程序)。。。 或者,将应用程序

  • 我试图在使用RESTendpoint的骆驼路由中构建一个分割/聚合模式。它需要一个包含请求详细信息列表的请求对象。我想并行处理请求详细信息,然后将聚合结果返回给调用方。我希望这是一个同步调用。 这是我的路线中的代码。 我希望调用的结果是聚合调用(我的响应对象)的输出。但我实际上得到的是REST调用返回的请求对象?? 当我放入更多的日志语句时,我可以看到Split调用正在触发多个线程,这很好。我可以

  • 我在Ubuntu 18.04.1 LTS上安装了以下内容: 有人知道怎么修吗?

  • 有没有一种方法可以恢复提交,使我的本地副本保留在提交中所做的更改,但它们在我的工作副本中变成未提交的更改?回滚提交会将您带到上一次提交——我希望保留所做的更改,但是我将它们提交到了错误的分支。 这没有被推动,只是被promise。

  • 我有一个模式,用户需要填写他的电子邮件广告。问题是输入字段在每次键入字母后都会失去状态。 父组件: 示例MailingModal: 文本输入: 我在其他几个地方使用输入字段。但在我的模态中,它不是。我做错了什么?

  • 主要内容:实例JSF通过Facelets提供复合组件(有点类似于)的概念。复合组件是一种特殊类型的模板,它充当应用程序中的一个组成部分。 复合组件由标记标签和其他现有组件组成。 这个可重复使用的用户创建的组件具有定制的定义功能,并且可以像任何其他组件一样具有连接到它的验证器,转换器和监听器。 包含标记标签和其他组件的任何XHTML页面都可以转换为复合组件。 以下表格包含复合标签以及说明 - 标签 功能 它用于声