【问题标题】:actionListener not called inside <c:if>在 <c:if> 内未调用 actionListener
【发布时间】:2012-12-19 11:28:31
【问题描述】:

我有以下代码,使用 jsf2.2,primefaces 3.2。 我的要求是根据 updateFlag 更新项目。 当我像下面的代码一样使用 c:if (xmlns:c="http://java.sun.com/jsp/jstl/core") 时,不会调用更新命令按钮的操作侦听器。但是如果我使用 而不是 它可以工作。请帮助我理解它,我想我应该使用 c:if 但它不起作用。

<p:dialog widgetVar="projectUpdate" id="projectUpdatePanel" modal="false" >

                <p:panel>
                    <c:if test="#{projectBean.updateFlag == false}">
                            <h:outputText value="Project Title" />
                            <p:inputText disabled="true" value="#{projectBean.selectedProjectDo.projectTitle}" />
                            <p:commandButton value="Update" disabled="true" />
                            <p:commandButton value="Cancel" actionListener="#{projectBean.cancelUpdate}" />
                    </c:if>
                    <c:if test="#{projectBean.updateFlag == true}">                           
                            <h:outputText value="Project Title"/>
                            <p:inputText value="#{projectBean.selectedProjectDo.projectTitle}" />
                            <p:commandButton value="Update" actionListener="#{projectBean.updateProject}" />
                            <p:commandButton value="Cancel" actionListener="#{projectBean.cancelUpdate}" />
                    </c:if>
                </p:panel>

            </p:dialog>

【问题讨论】:

    标签: jsf-2 primefaces jstl actionlistener facescontext


    【解决方案1】:

    你最好按照以下方式使用它(在 disabled 属性上设置条件)

    <p:panel>                     
        <h:outputText value="Project Title"/>
        <p:inputText disabled="#{not projectBean.updateFlag}" 
            value="#{projectBean.selectedProjectDo.projectTitle}" />
        <p:commandButton disabled="#{not projectBean.updateFlag}" value="Update" 
            actionListener="#{projectBean.updateProject}" />
        <p:commandButton value="Cancel" actionListener="#{projectBean.cancelUpdate}" />
    </p:panel>
    

    一般来说:除非你真的需要它们,否则不要使用 JSTL 标签...

    【讨论】:

      【解决方案2】:

      这是一个非DRY 代码的经典示例,这很糟糕。丹尼尔完美地展示了如何让它干燥,但他没有解释你的问题的原因。

      根据问题症状,当#{projectBean} 是视图范围的bean 时会发生这种情况。视图范围的 bean 存储在 JSF 视图状态中。因此,视图范围的 bean 仅在恢复视图阶段之后可用。但是,JSTL 标记在恢复视图阶段运行,而视图范围的 bean 尚不可用。这会导致创建一个全新的视图范围 bean 实例,然后将其替换为存储在恢复的 JSF 视图状态中的真实视图范围 bean。 JSTL 使用的全新且独立的视图范围 bean 将其所有属性设置为默认值,因此具有updateFlag=false 的块将始终被调用。

      另见:

      【讨论】:

      • 感谢 BalusC,您的解释很好。它非常有帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-12
      • 2010-10-09
      • 2020-12-18
      相关资源
      最近更新 更多