【问题标题】:CommandButton in jsfjsf中的命令按钮
【发布时间】:2012-10-12 07:19:15
【问题描述】:

在我的代码中,当我将它放在第二个或第三个 PanelGroup 中时,CommandButton 操作不起作用。它仅在我放入第一个 PanelGroup 时才有效。我的代码如下所示。可能是什么问题?

<ui:define name="pageLocations">
    <h:panelGroup layout="block" id="pageLocations">
        <c:if test="#{param.typeTab == null &amp;&amp; param.relationTab == null &amp;&amp; param.propertyTab == null}">
            <ui:param name="defaultHeaderTitle" value="Properties"/>
            <!--<h:outputText value="Properties" />--> 
        </c:if>
        <p class="breadcrumb">Admin <ezcomp:out value="raquo" /> 
            Fields <ezcomp:out value="raquo" /> 
            <strong>
                #{param.pageHeaderTitle}#{defaultHeaderTitle} 
            </strong>
        </p>
    </h:panelGroup>
</ui:define>
<!--<ui:define></ui:define>-->
<ui:define name="pageHeaderTitle">
    <h:outputText value="#{param.pageHeaderTitle}#{defaultHeaderTitle}" id="soso" /> 
</ui:define>

<ui:define name="sidemenu">
    <ui:param name="fieldsPage" value="active"/>
</ui:define>

<ui:define name="admin-content">
    <h:form prependId="false">
        <h:panelGroup layout="block" class="well well-small" id="mainPanel">
            <h:panelGroup layout="block" class="row-fluid">
                <div class="span1"><ezcomp:out value="nbsp"/></div>
                <div class="span4">
                    <ul class="nav nav-pills" style="margin-top:4px;margin-bottom:0">
                        <c:if test="#{param.typeTab == null &amp;&amp; param.relationTab == null &amp;&amp; param.propertyTab == null }">
                            <ui:param name="default" value="active"/>
                            <ui:param name="defaultHeaderTitle" value="Properties"/>
                        </c:if>
                        <li class="#{param.propertyTab} #{default}">
                            <p:commandLink  value="Properties" immediate="true" update="mainPanel,fields,:soso,:pageLocations" >
                                <f:param name="propertyTab" value="active"/>
                                <f:param name="pageHeaderTitle" value="Properties"/> 
                            </p:commandLink>
                        </li>
                        <li class="#{param.typeTab}">
                            <p:commandLink  value="Types" immediate="true" async="true" update="mainPanel,fields,:soso,:pageLocations" >
                                <f:param name="typeTab" value="active"/>
                                <f:param name="pageHeaderTitle" value="Types"/>
                            </p:commandLink>
                        </li>
                        <li class="#{param.relationTab}">
                            <p:commandLink value="Fields Relations" immediate="true" update="mainPanel,fields,:soso,:pageLocations">
                                <f:param name="relationTab" value="active"/>
                                <f:param name="pageHeaderTitle" value="Fields Relations"/>
                            </p:commandLink>
                        </li>
                    </ul>
                </div>

            </h:panelGroup>
        </h:panelGroup>
        <h:panelGrid id="fields" width="100%">

            <h:panelGroup layout="block" rendered="#{param.propertyTab == 'active' || default == 'active' }">
                <ui:include src="property/properties.xhtml"></ui:include>
            </h:panelGroup>
            <h:panelGroup layout="block" rendered="#{param.typeTab == 'active'}">
                <ui:include src="type/types.xhtml"></ui:include>
            </h:panelGroup>
            <h:panelGroup layout="block" rendered="#{param.relationTab == 'active'}">
                <ui:include src="fields-relations.xhtml"></ui:include>
                <h:commandButton value="Create" actionListener="#{fieldsRelationsController.createRelations()}"  >
                    <f:ajax listener="#{fieldsRelationsController.createRelations()}"/>
                </h:commandButton>

            </h:panelGroup>

        </h:panelGrid>

    </h:form>
</ui:define>

【问题讨论】:

  • 为什么会有 2 个监听器调用 你有没有得到任何解析器错误?因为您在操作调用中使用 ()。
  • @Stivel:双重侦听器调用很奇怪,但是自 Java EE 6 / EL 2.2 起 EL 语法完全有效(自 2009 年以来已经推出,请保持最新状态)。
  • 但是当我将commandButton放在第一个时,监听器没有问题
  • 非常感谢 Stivel 和 BalusC 的帮助

标签: jsf primefaces


【解决方案1】:

这是因为这些面板组是根据命令按钮发起的后续 POST 请求中不再存在的请求参数有条件地呈现的。

当 JSF 处理 POST 请求时,rendered 条件也被重新评估。由于缺少请求参数,它评估false,因此不会处理命令按钮组件,因此不会调用关联的操作。

要解决这个问题,您需要在命令按钮的&lt;f:param&gt; 中传递负责计算rendered 属性结果的请求参数。

<h:commandButton value="Create" action="#{fieldsRelationsController.createRelations}">
    <f:ajax />
    <f:param name="relationTab" value="active"/>
</h:commandButton>

(请注意,我已将 actionListener 替换为 action 并删除了双 f:ajax listener,我不知道您在想什么,但我假设它是黑暗中未经过深思熟虑的芽的剩余物)

另见:

【讨论】:

    猜你喜欢
    • 2011-07-09
    • 2017-10-04
    • 2010-10-13
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 2010-11-17
    • 2011-07-05
    • 1970-01-01
    相关资源
    最近更新 更多