6

我遇到了我的应用程序的奇怪行为。命令按钮在第二次点击时开始调用动作。首先 - 没有任何反应。它对 firefox 和 chromium 生效,但在顿悟中照常工作。

我的环境: - ubuntu 11.04 - glassfish 3.1.1 - jsf 2.X - primefaces 3.2 - firefox 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() 仅在第二次单击命令按钮时调用,尽管按钮是可见的。当字段未正确填写时,它们旁边会出现相应的消息,但是...仅在第二次单击时!有什么建议吗?

我检查了以下几点:这个建议,但没有找到解决方案。

4

1 回答 1

7

好的,我发现了问题所在。所以:

问题的出现: 我有一个用户数据页面。一些输入项和命令按钮。单击“创建”按钮时,输入数据被检出。如果数据正常,则创建用户并出现用户表,或者出现错误时 - 出现错误消息并且用户停留在同一页面上: 在此处输入图像描述

我发现了一些不稳定的行为。第一次点击(动作)没有发生任何事情,只有第二次和后续动作有效果。但。这种行为我使用的网络浏览器类型有关。

所有操作都发生在第一次点击时,在网络浏览器中:顿悟和 konqueror。尽管在 Firefox 和 Chromium 中,我观察到了我上面描述的这种不稳定的行为。命令按钮的代码是:

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

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

原因。 @Balusc 在他的笔记中列举了原因,这是我第一次大致阅读的。这确实是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"/>

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

于 2012-05-19T12:36:33.287 回答