【问题标题】:JSF input processing orderJSF 输入处理顺序
【发布时间】:2015-01-21 12:21:21
【问题描述】:

有没有办法指定提交后输入的设置顺序?

这是我的情况:

<h:inputText id="fieldA" value=#{myBean.myObject.fieldA}" />
<h:inputText id="fieldB" value=#{myBean.myObject.fieldB}" />
<p:autoComplete id="myObject" value=#{myBean.myObject" converter="myObjectConverter" />
<h:inputText id="fieldC" value=#{myBean.myObject.fieldD}" />
<h:inputText id="fieldD" value=#{myBean.myObject.fieldC}" />

我遇到的问题是,由于输入是按声明的顺序处理的,因此在 myObject 的初始实例中设置了 fieldA 和 fieldB,然后设置了 myObject(使用新实例,因此字段 A 和 fieldB 的值是丢失),最后 fieldC 和 fieldD 设置没有问题。

如果我能设法先设置 myObject 开始,那将解决我的问题。

我将临时将字段和 myObject 设置为我的 bean 的两个不同属性,并在单击保存按钮后填充 myObject。但它看起来更像是一种 hack,而不是真正的解决方案。

不用说,在输入文本之前声明自动完成不是一种选择。

提前致谢。

【问题讨论】:

  • 对于这样的情况,我通常会定义fieldAfieldB(甚至fieldCfieldD作为myBean的属性,并在访问时将值应用到myObject来自控制器的对象。
  • 我更新了我之前的(无价值的)答案,请看 :)

标签: jsf primefaces


【解决方案1】:

在快捷方式中: 您可以使用 primefaces 中的 &lt;p:inputText&gt; 标签。然后,您可以禁用所有输入。将 ajax 添加到您的自动完成,并在处理自动完成后更新其他输入。输入 disable 属性可以设置为取决于 autoComplete 是否不为空。这样你就可以让用户先进入autoComplet。

【讨论】:

    【解决方案2】:

    您可以尝试将immediate="true" 设置为p:autocomplete,以便在所有其他组件之前在APPLY_REQUEST_VALUES 阶段对其进行处理。

    简单的解决方案是在选择 p:autocomplete 项目时更新 h:inputTexts 以反映其值:

    <p:autoComplete id="myObject" value="#{myBean.myObject}" ...>
        <p:ajax event="itemSelect" process="@this" update="fieldA fieldB fieldC fieldD" />
    </p:autoComplete>
    

    但这会还原h:inputTexts 上的用户输入。而且由于您不能将p:autocomplete 移到顶部,这可能也是不可接受的。

    如果您不能/不想使用 ajax,您可以强制提前更新模型:

    <p:autoComplete id="myObject" value="#{myBean.myObject}" immediate="true" 
        valueChangeListener="#{component.updateModel(facesContext)}" ... />
    

    但是,在我看来,这不是很用户友好...

    附:这次是经过测试的:)

    【讨论】:

    • 嗨 Michele,p:autocomplete 并不总是可选择的:我无法强制选择,因为如果从现有实体中没有选择任何实体,我必须创建一个新实体:如果没有从自动完成,输入值按原样返回给创建要持久化的新实例的转换器。此外,即使选择了自动完成建议并更新了相应的输入,我们也必须能够通过这些相同的输入更新其字段之一(字段 A-D)。
    • 你能发布转换器代码和完整的自动完成标签吗?
    【解决方案3】:

    没有很好的方法来解决这个问题;您的情况已经不太理想并且很hacky(re:无法简单地重新排序字段)。一种解决方法是将fieldAfieldB 设置为myObject 的属性。在转换器中,您可以从组件中提取值。观察

    1. 这样设置属性

      <h:inputText id="fieldA" binding=#{fieldA}" />
      <h:inputText id="fieldB" binding=#{fieldB}" />
      <p:autoComplete id="myObject" value=#{myBean.myObject" converter="myObjectConverter">
          <f:attribute name="fieldA" value="#{fieldA}"/>
          <f:attribute name="fieldB" value="#{fieldB}"/>
      </p:autoComplete>
      

      binding 属性实际上是 turns those components into page-scoped variables,允许您将它们作为属性传递给您的 p:autocomplete

    2. 在转换器中获取这些变量的值

      //Retrieve the fields and cast to UIInput, necessary
      //to retrieve the submitted values
      UIInput fieldA = (UIInput) component.getAttributes().get("fieldA");
      UIInput fieldB = (UIInput) component.getAttributes().get("fieldB");
      
      //Retrieve the submitted values and do whatever you need to do
      String valueA = fieldA.getSubmittedValue().toString();
      String valueB = fieldB.getSubmittedValue().toString();
      

    更重要的是,你为什么不能重新排序表单的字段/逻辑流程?如果你这样做了,你就可以避免所有这些讨厌的事情

    【讨论】:

      猜你喜欢
      • 2019-01-16
      • 2019-04-16
      • 1970-01-01
      • 2020-11-25
      • 1970-01-01
      • 1970-01-01
      • 2017-06-04
      • 1970-01-01
      • 2023-03-31
      相关资源
      最近更新 更多