2016-04-25 49 views
0

我的意图是显示填充文本区域组件的信息。当它获得焦点时,我会显示信息,当它失去焦点时,我清除信息。我不想处理任何输入值,只需抓住焦点并模糊事件,然后调用监听器并显示/清除消息。为什么PrimeFaces 5.3在捕获“模糊”和“焦点”事件时不会调用我的侦听器函数?

我已经阅读了BalusC对条件呈现的评论,所以我将条件文本消息放到了“总是呈现”的JSF组件中。

我的“始终呈现”f:outPutPanel组件显示在生成的XHTML代码中,但我的侦听器函数从未调用过。据我所知,primefaces监听器的方法签名只是void somefunction(),不像jsf ajax监听器中的那样。 我还阅读了BalusC有关proccess属性包含@this的评论,但在我的情况下,似乎并不合理,因为我不想捕获任何输入值。 我是JSF和primefaces的新手,所以任何帮助表示赞赏。

我的相关视图片断:

<h:form> 
    <h:panelGroup layout="block" id="info"> 
     <h:outputText rendered="#{ebookController.infoMessage != null}" value="#{ebookController.infoMessage}"/> 
    </h:panelGroup> 
    .... 
    <p:inputTextarea id="description" styleClass="form-control vspace" required="true" requiredMessage="Kérlek, add meg az e-könyv rövid leírását" value="#{ebookController.newEbook.description}" rows="20" cols="30" counter="display" maxlength="500" counterTemplate="{0} karakter lehet még" autoResize="false" validatorMessage="Az e-könyv leírása maximum 500 karakterből állhat"> 
     <f:validateLength maximum="500"/> 
     <p:ajax event="focus" process="@none" update="info" listener="#{ebookController.setTextAreaInfoMessage()}"/> 
     <p:ajax event="blur" process="@none" update="info" listener="#{ebookController.clearInfoMessage()}"/> 
    </p:inputTextarea> 
    <h:outputText id="display" /> 
</h:form> 

我的相关的Java代码:

@Named(value = "ebookController") 
@SessionScoped 
public class EbookController implements Serializable { 

private String infoMessage; 

public String getInfoMessage() { 
    return infoMessage; 
} 

public void setInfoMessage(String infoMessage) { 
    this.infoMessage = infoMessage; 
} 

public void setTextAreaInfoMessage(){ 
    setInfoMessage("Tipp: Az e-könyved bemutatása során a fontos részeket emeld ki, és tagold a szöveget bekezdésekkel. Ha egy bekezdés végére értél, csak egy ENTER-t üss!"); 
} 

public void clearInfoMessage(AjaxBehaviorEvent e){ 
     setInfoMessage(""); 
} 
.... 
} 

回答

0

解决方案1:用户F:AJAX

<f:ajax immediate="true" event="focus" process="@none" render="info" 
       listener="#{ebookController.setTextAreaInfoMessage()}" /> 
<f:ajax immediate="true" event="blur" process="@none" render="info" 
       listener="#{ebookController.clearInfoMessage()}" /> 

管Bean

public void setTextAreaInfoMessage() { 
     System.out.println("setTextAreaInfoMessage"); 
     setInfoMessage(
       "Tipp: Az e-könyved bemutatása során a fontos részeket emeld ki, és tagold a szöveget bekezdésekkel. Ha egy bekezdés végére értél, csak egy ENTER-t üss!"); 
    } 

    public void clearInfoMessage() { 
     System.out.println("clearInfoMessage"); 
     setInfoMessage(""); 
    } 

参考Problem with h:form and p:ajax

+0

谢谢你的回答。不幸的是,我还得到了来自谷歌开发工具采取了以下部分回应:“<部分响应ID = “j_id1”> <更新ID = “j_idt16:j_idt17”>​​ <更新ID =“j_idt16:信息“>

<更新ID =” j_id1:javax.faces.ViewState:0" > 5250913947076146787:2613487393278789583 ” – Roland

+0

我能够重新创建你在我的沙箱环境的情况。然后找到了BalusC给出的解决方案。我的测试是在Mojarra jsf 2.2.4上完成的,Tomcat 8上的primefaces-5.3 – Ravi

+0

嗨,Ravi。您不需要将'void setTextAreaInfoMessage()'的方法签名更改为'void setTextAreaInfoMessage(AjaxBehaviorEvent e)'。我使用GlassFish 4.1.1和Mojarra 2.2.12。真的,我已经用完了想法。 – Roland