2012-05-18 41 views
6

我来到了我的应用程序的奇怪行为。命令按钮开始在第二次命中时调用动作。首先 - 没有任何反应。它在firefox和chromium上生效,但在顿悟中像往常一样工作。命令按钮在二次推送时调用动作(jsf)

我的环境: - Ubuntu的11.04 - GlassFish的3.1.1 - JSF 2.X - primefaces 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,但没有找到解决方案。

+0

你百分之百确定它是不是分5。和第7个答案?你没有明确地反驳你的代码 – BalusC

+0

我已经检查出来。首先我确定呈现的属性是好的,并且我在@PostConstruct init()中另外设置了它。的形式到userForm并添加到命令按钮 仍然适用于firefox和chromium中的第二个动作,以及第一个在ephipany中。我会试试看,可能我做错了什么 – Zbyszek

回答

7

好的,我发现有什么问题。所以:

问题的出现: 我有一个用户数据页面。一些输入项目和命令按钮。当点击“创建”按钮时,输入数据被检出。如果数据正常,则会创建用户并出现用户表,或出现错误时显示错误消息并且用户停留在同一页面上: enter image description here

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

所有操作都是在webrowsers中的第一次点击发生:epiphany和konqueror。尽管在Firefox和铬中我观察到了上面描述的这种不稳定的行为。命令按钮的代码为:

<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> 

其中用户窗体是h的正确ID:形式。没有结果,仍然只有第二次和随后的点击有效 - 显示错误消息。

所以我改变了前一页的声明命令按钮,即调用了不规则行为页面。原来它是:

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

primefaces命令按钮。正如Balusc所写:“如果带有UICommand按钮的父母已被渲染/更新,请事先通过ajax请求,那么第一个操作将始终失败。“

因此,我改变声明:

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

就是这样它工作正常,在任何浏览器,第一个动作