命令按钮在第二次按下时调用操作(JSF)

6

我发现我的应用程序出现了奇怪的行为。命令按钮在第二次点击时才开始执行操作,第一次点击没有反应。这在firefox和chromium上生效,但在epiphany上正常工作。

我的环境: - ubuntu 11.04 - glassfish 3.1.1 - jsf 2.X - primefaces 3.2 - firefox 12.0 - epiphany 2.30.6

代码示例:

    <ui:define name="content">
       <h:form id="form">
            <h:panelGrid id="panelGrid" columns="3">

                <h:outputText value="#{msg.fieUserName}:"/>
                <h:inputText  id="name"  value="#{userBb.editedUser.username}" />
                <h:message    for="name" styleClass="error_msg"/>

                <h:outputText value="#{msg.fieUserDescription}:"/>
                <h:inputText  id="description"  value="#{userBb.editedUser.description}" />
                <h:message    for="description" styleClass="error_msg"/>

                <h:outputText   value="#{msg.fieUserPassword}:"/>
                <h:inputSecret  id="password" value="#{userBb.editedUser.password}" redisplay="true"/>
                <h:message      for="password" styleClass="error_msg"/>

                <h:outputText value="#{msg.fieUserRights}:"/>
                <p:selectOneMenu id=       "rights"
                                 value=    "#{userBb.editedUserGroup}"
                                 converter="#{pGroupOfUsersConverter}">
                    <f:selectItems
                        value    ="#{groupDao.findAll()}"
                        var      ="row"
                        itemLabel="#{groupDao.rightsDescription(row.id)}"
                        itemValue="#{row.groupname}" 
                        >
                    </f:selectItems>
                </p:selectOneMenu>
                <h:message for="rights" styleClass="error_msg"/>

                <h:outputText value="#{msg.fiePorofolioName}:" rendered="#{userBb.chosenNew}"/>
                <h:inputText  id="portName" value="#{userBb.portfelForNewUser.nazwa}" rendered="#{userBb.chosenNew}">
                    <f:validateBean disabled="true" />
                </h:inputText>
                <h:message for="portName" styleClass="error_msg" rendered="#{userBb.chosenNew}"/>

                <h:outputText    value="#{msg.fiePotofolioCurrency}:" rendered="#{userBb.chosenNew}"/>
                <p:selectOneMenu id=       "waldep" 
                                 value=    "#{userBb.portfelForNewUser.walutaDepozytowa}"
                                 converter="#{igConverter}"
                                 rendered= "#{userBb.chosenNew}"
                                 >
                   <f:selectItems value=    "#{igDao.waluty}" 
                                  var=      "row"
                                  itemLabel="#{row.nazwa}"/>
                </p:selectOneMenu>
                <h:message for="waldep" styleClass="error_msg" rendered="#{userBb.chosenNew}"/>

            </h:panelGrid>
            <h:panelGrid columns="2">
               <h:commandButton value="#{msg.butCreate}" action="#{userBb.formCreate()}" rendered="#{userBb.chosenNew}" />
               <h:commandButton value="#{msg.butSave}"   action="#{userBb.formEdit()}"   rendered="#{!userBb.chosenNew}"/>
               <h:commandButton value="#{msg.butBack}"   action="#{userBb.formBack()}"/>
            </h:panelGrid>
        </h:form>
    </ui:define>

在此示例方法中,只有在第二次单击命令按钮时才调用userBb.formCreate(),尽管该按钮可见。当字段未正确填写时,相应的消息将显示在它们旁边,但是...只有在第二次单击时!有什么建议吗?
我查看了来自这个建议的点,但没有找到解决方案。

你百分之百确定那个答案的第5点和第7点不是问题所在吗?你的代码中并没有明确证明这一点。 - BalusC
我已经检查过了。首先,我确保渲染属性没问题,并在@PostConstruct init()中额外设置了它。其次,我将表单的ID更改为userForm,并添加到命令按钮中: <h:commandButton value="#{msg.butCreate}" action="#{userBb.formCreate()}" rendered="#{userBb.chosenNew}"> <f:ajax render="userForm"/> </h:commandButton> 在Firefox和Chromium中第二个操作仍然有效,在Ephipany中第一个操作有效。我会尝试找出原因,可能是我做错了什么。 - Zbyszek
1个回答

7

好的,我找到了问题所在。因此:

问题出现的原因: 我有一个用户数据页面,其中包含一些输入项和命令按钮。点击“创建”按钮后,会检查输入数据。如果数据正常,则会创建用户并显示用户表格;如果存在错误,则会显示错误消息,并保持在同一页上: enter image description here

我发现了一些不稳定的行为。第一次点击(动作)没有任何反应,只有第二次和随后的操作才会产生影响。但是这种行为与我使用的网络浏览器有关联

所有操作都来自于第一次点击,在网页浏览器:Epiphany和Konqueror中。虽然在Firefox和Chromium中,我观察到了上述不稳定的行为。命令按钮的代码如下:

<h:commandButton value="#{msg.butCreate}" action="#{userBb.formCreate()}" rendered="#{userBb.chosenNew}"/>

不同的浏览器有不同的行为。

原因。 @Balusc在他的笔记中列举了原因,我第一次粗略地阅读了其中的第七点。

解决方案。 我尝试以以下方式更改按钮声明:

<h:commandButton value="#{msg.butCreate}" action="#{userBb.formCreate()}" rendered="#{userBb.chosenNew}">
   <f:ajax render="userForm"/>
</h:commandButton> 

用户表单的正确ID应该是h:form。但没有结果,仍然只有第二次及以后的点击才会产生反应-显示错误消息。

因此,我从之前页面改变了声明命令按钮,调用了不稳定行为的页面。最初是这样:

<p:commandButton value="#{msg.butNew}"    action="#{userBb.actionNew()}"/>

PrimeFaces命令按钮。正如Balusc所写的那样:"如果UICommand按钮的父级在之前被ajax请求渲染/更新过,那么第一个动作将始终失败。"

因此,我将声明更改为:

<p:commandButton value="#{msg.butNew}"    action="#{userBb.actionNew()}" ajax="false"/>

好的,明白了。这就是全部内容。对于第一次操作而言,在任何浏览器中都能正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接