如何在违反某些验证后更改<p:selectonemenu>时重置输入组件</p:selectonemenu>

时间:2013-11-23 23:28:32

标签: jsf primefaces jsf-2.2

当加载JSF页面时,我正在从包含区域列表的数据库中填充<p:selectOneMenu>

当选择此菜单中的区域时,会显示一组<p:inputText>,其中用户可以插入与产品重量相对应的费用,该费用将由运输商转移到菜单中的选定区域。这可以在以下snap shot中显示。

enter image description here

可以看出,当用户输入非数字值时,如果按下给定的保存按钮<p:commandButton>,则会发生验证违规(每个文本字段顶部显示的数字对应于重量)。 / p>

如果用户现在更改菜单中的区域 - 第一个面板没有按下重置按钮,则数据对应于新选择的区域仅在重置按钮为时才会加载到这些文本字段中按下follows(因为违反了验证)..

enter image description here

那么,如果在菜单中更改项目(区域),如何在上次验证违规后加载数据?

<p:selectOneMenu>的更改事件,在这种情况下,应执行<p:resetInput>完成的功能。

希望你能理解我的意思:)。

1 个答案:

答案 0 :(得分:8)

基本上,您需要<p:resetInput> <p:ajax><p:selectOneMenu>提供的功能。这确实是不可能的,因为<p:resetInput>需要放在实现ActionSource的组件中,例如UICommand组件。

最好的办法是让<p:remoteCommand>接管<p:ajax>更改侦听工作。在那里你可以放<p:resetInput>

想象一下,你目前有一个:

<h:form>
    <p:selectOneMenu id="zone">
        <f:selectItems ... />
        <p:ajax listener="#{bean.changeZone}" update="data" />
    </p:selectOneMenu>

    <p:panel id="data">
        ...
    </p:panel>
</h:form>

然后这个改变应该做:

<h:form>
    <p:selectOneMenu id="zone" onchange="changeZone()">
        <f:selectItems ... />
    </p:selectOneMenu>
    <p:remoteCommand name="changeZone" process="@this zone" action="#{bean.changeZone}" update="data">
        <p:resetInput target="data" />
    </p:remoteCommand>  

    <p:panel id="data">
        ...
    </p:panel>
</h:form>

不要忘记从侦听器方法中删除AjaxBehaviorEvent参数。无论如何,它在这个特殊情况下毫无用处。