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

2024-04-06

我的应用程序出现了奇怪的行为。命令按钮在第二次点击时开始调用操作。首先-什么也没有发生。它对火狐和铬有效,但在顿悟中照常工作。

我的环境: - Ubuntu 11.04 - 玻璃鱼 3.1.1 -jsf 2.X - 素面 3.2 - 火狐 12.0 - 顿悟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() 方法。当字段未正确填写时,相应的消息会出现在它们旁边,但是......仅在第二次单击时!有什么建议吗?

我从以下位置查看要点:这个建议 https://stackoverflow.com/a/2120183/1331274,但没有找到解决方案。


好吧,我发现出了什么问题。所以:

Appearance of the problem: I've got a page for user data. Some input items and command buttons. When clicking "Create" button, input data is checked out. If data is ok user is created and table of users appears, or when there are errors - errors messages appear and user stays on the same page: enter image description here

我发现一些不稳定的行为。第一次单击(操作)时没有发生任何事情,只有第二次和后续操作才会产生效果。但。这种行为是related我使用的网络浏览器类型。

所有操作均从网络浏览器中的第一次单击开始发生:epphany 和 konqueror。尽管在火狐和铬中我观察到了我上面描述的这种不稳定的行为。命令按钮的代码是:

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

不同网络浏览器中的不同行为。

原因。@Balusc 在他的文章中列举了原因note https://stackoverflow.com/a/2120183/1331274,我第一次大致读到。确实是pt。 7.

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

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

其中 userForm 是 h:form 的正确 ID。没有结果,仍然只有第二次和后续点击有效果 - 显示错误消息。

因此,我更改了上一页的声明命令按钮,该按钮调用了不稳定的行为页面。原来是:

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

primefaces 命令按钮。就是这样,正如 Balusc 所写:“如果带有 UICommand 按钮的父级已预先通过 ajax 请求渲染/更新,那么第一个动作总是会失败。”

所以我将声明更改为:

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

就是这样。对于第一个操作,它在任何浏览器中都可以正常工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

命令按钮在第二次按下时调用操作 (jsf) 的相关文章

随机推荐