为什么 PrimeFaces 5.3 在我捕捉到 "blur" 和 "focus" 事件时不调用我的侦听器函数?
Why does PrimeFaces 5.3 not call my listener function when I catch the "blur" and "focus" events?
我的目的是显示有关填充文本区域组件的信息。当它获得焦点时我显示信息,当它失去焦点时我清除信息。我不想处理任何输入值,只是捕捉焦点和模糊事件并调用侦听器和 show/clear 消息。
我已阅读 BalusC 关于条件渲染的评论,因此我将条件文本消息放入 "always rendered" JSF 组件。
我的 "always rendered" 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("");
}
....
}
解决方案 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
我的目的是显示有关填充文本区域组件的信息。当它获得焦点时我显示信息,当它失去焦点时我清除信息。我不想处理任何输入值,只是捕捉焦点和模糊事件并调用侦听器和 show/clear 消息。
我已阅读 BalusC 关于条件渲染的评论,因此我将条件文本消息放入 "always rendered" JSF 组件。
我的 "always rendered" 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("");
}
....
}
解决方案 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