Primefaces 对话框 + 命令按钮 [英] Primefaces dialog + commandButton

查看:20
本文介绍了Primefaces 对话框 + 命令按钮的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将素面 结合使用.在我的 .xhtml 页面中,我有一个用于显示对话框的选项列表和命令按钮.对话框显示带有来自选择列表的目标值的数据表.对话框有两个按钮:取消和提交.我的问题是提交按钮没有被触发.奇怪的是,对话框中的 commandButton 起作用了.

I'm trying to use primefaces <p:dialog> combined with <p:commandButton>. In my .xhtml page I have a picklist and commandButton which is used to show a dialog. Dialog displays datatable with target values from picklist. Dialog has two buttons: cancel and submit. My problem is that submit button is not fired. What's strange, commandButton out of dialog works.

这是我的 .xhtml:

Here's my .xhtml:

<body>
   <ui:composition template="./../resources/mainTemplate.xhtml">
        <ui:define name="content">
            <h:form>
                <p:dialog id="dlg" header="#{messages.chooseSkillLevel}" widgetVar="dlg" modal="true" dynamic="true">
                    <h:dataTable value="#{editSkills.skillsAndLevels}" var="skillslevel">
                        <h:column>
                            #{skillslevel.skill.umiejetnosc}
                        </h:column>
                        <h:column>
                            <p:selectOneMenu value="#{skillslevel.level}" >
                                <f:selectItems value="#{editSkills.levels}" var="level" itemLabel="#{level.stopien}" itemValue="#{level.id}" />
                            </p:selectOneMenu>
                        </h:column>
                    </h:dataTable>
                    <p:commandButton value="#{messages.confirm}" action="#{editSkills.showSkillsAndLevels}" oncomplete="dlg.hide();" />   THIS BUTTON IS NOT FIRED
                    <p:commandButton value="#{messages.cancel}" onclick="dlg.hide()"/>
                </p:dialog>
                <p:pickList value="#{editSkills.skills}" var="skill" effect="none"  
                itemValue="#{skill.id}" itemLabel="#{skill.umiejetnosc}"  
                showSourceFilter="true" showTargetFilter="true" filterMatchMode="contains" 
                addLabel="#{messages.add}" removeLabel="#{messages.remove}" removeAllLabel="#{messages.removeAll}" >  
                    <f:facet name="sourceCaption">#{messages.skillsList}</f:facet>  
                    <f:facet name="targetCaption">#{messages.yourSkills}</f:facet>
                    <p:ajax event="transfer" listener="#{editSkills.onTransfer}" /> 
                    <p:column style="width:100%;">  
                        #{skill.umiejetnosc}  
                    </p:column> 
                </p:pickList>
                <p:commandButton value="#{messages.confirm}" action="#{editSkills.afterSubmit}" update="dlg" oncomplete="dlg.show()" />   THIS BUTTON WORKS FINE
                <p:commandButton value="#{messages.cancel}" action="profile" immediate="true"/>
           </h:form>
        </ui:define>
    </ui:composition>
</body>

我已经标记了工作按钮而不是工作按钮.我需要做什么才能让它工作?

I've marked working button and not working one. What do I have to do to make it working?

推荐答案

您可以尝试以下任一方法,我投第一票,IMO 的设计更简洁

You can try either of the following , I vote number one, it's a cleaner design IMO

  1. 放在一般的 之外,并放置一个 inside

  1. Bring the <p:dialog/> outside of the general <h:form/> and put an <h:form/> inside it instead

  <p:dialog id="dlg" header="#{messages.chooseSkillLevel}" widgetVar="dlg" modal="true" dynamic="true">
      <h:form>
            <h:dataTable value="#{editSkills.skillsAndLevels}" var="skillslevel">
                <h:column>
                    #{skillslevel.skill.umiejetnosc}
                </h:column>
                <h:column>
                    <p:selectOneMenu value="#{skillslevel.level}" >
                        <f:selectItems value="#{editSkills.levels}" var="level" itemLabel="#{level.stopien}" itemValue="#{level.id}" />
                    </p:selectOneMenu>
                </h:column>
            </h:dataTable>
            <p:commandButton value="#{messages.confirm}" action="#{editSkills.showSkillsAndLevels}" oncomplete="dlg.hide();" />   THIS BUTTON IS NOT FIRED
            <p:commandButton value="#{messages.cancel}" onclick="dlg.hide()"/>
           </h:form>
        </p:dialog>

  • appendToBody="false" 添加到 <p:dialog/> 以确保对话框在 DOM 中的 html 表单中呈现自动重定位到 HTML 正文的末尾.但这可能会导致在各种浏览器中呈现不一致.

  • Add appendToBody="false" to the <p:dialog/> to ensure the dialog is rendered within the html form in the DOM instead of being auto-relocated to end of HTML body. But this may cause inconsistent rendering in various browsers.

    这篇关于Primefaces 对话框 + 命令按钮的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

  • 查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆