我的应用程序出现了奇怪的行为。命令按钮开始在第二次点击时调用操作。首先 - 什么也没有发生。它对 Firefox 和 Chromium 有效,但在顿悟中照常工作。
我的环境:
- 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() 方法。当字段未正确填写时,它们旁边会出现适当的消息,但是...仅在第二次单击时!有什么建议吗?
我从以下位置查看积分:this advice ,但没有找到解决方案。
最佳答案
好的,我发现出了什么问题。所以:
问题出现:
我有一个用户数据页面。一些输入项和命令按钮。单击“创建”按钮时,将 checkout 输入数据。如果数据正常,用户创建并出现用户表,或者出现错误时 - 出现错误消息并且用户停留在同一页面上:
我发现了一些不稳定的行为。第一次点击( Action )时什么也没有发生,只有第二次和后续 Action 有效果。但。这种行为是 相关 到我使用的那种网络浏览器。
所有操作都从第一次点击开始,在 webrowsers 中:epiphany 和 konqueror。尽管在 Firefox 和 Chromium 中,我观察到了我上面描述的这种不稳定的行为。命令按钮的代码是:
<h:commandButton value="#{msg.butCreate}" action="#{userBb.formCreate()}" rendered="#{userBb.chosenNew}"/>
不同浏览器中的不同行为。
原因。
@Balusc 在他的 note 中列举了原因。 ,我大致第一次阅读。确实是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()}"/>
素面命令按钮。就是这样,正如 Balusc 所写:“如果带有 UICommand 按钮的父级 由 ajax 请求预先呈现/更新 ,那么第一个操作将始终失败。”
所以我将声明更改为:
<p:commandButton value="#{msg.butNew}" action="#{userBb.actionNew()}" ajax="false"/>
就是这样。对于第一个操作,它在任何浏览器中都可以正常工作。
关于jsf - 命令按钮在第二次按下时调用操作 (jsf),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10651199/