【问题标题】:Why does PrimeFaces 5.3 not call my listener function when I catch the "blur" and "focus" events?为什么当我捕捉到“blur”和“focus”事件时,PrimeFaces 5.3 不调用我的侦听器函数?
【发布时间】:2016-08-18 21:08:27
【问题描述】:

我的目的是显示有关填充文本区域组件的信息。当它获得焦点时我显示信息,当它失去焦点时我清除信息。我不想处理任何输入值,只是捕获焦点和模糊事件并调用侦听器并显示/清除消息。

我已阅读 BalusC 关于条件渲染的评论,因此我将条件文本消息放入“始终渲染”的 JSF 组件。

我的“始终呈现”f:outPutPanel 组件显示在生成的 XHTML 代码中,但我的侦听器函数从未被调用。据我所知,primefaces 监听器的方法签名只是 void somefunction() 不像在 jsf ajax 监听器中。 我还阅读了 BalusC 关于在 proccess 属性中包含 @this 的评论,但就我而言,这似乎不合理,因为我不想捕获任何输入值。 我是 JSF 和 primefaces 的新手,因此不胜感激。

我的相关观点sn-p:

<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("");
}
....
}

【问题讨论】:

    标签: ajax primefaces jsf-2.2


    【解决方案1】:

    解决方案 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()}" />
    

    托管豆

    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

    【讨论】:

    • 感谢您的回答。不幸的是,我仍然从 Google 开发工具中得到以下部分响应:'
      5250913947076146787:2613487393278789583更改> 部分响应>'
    • 我能够在我的沙盒环境中重新创建您的案例。然后找到了BalusC给出的解决方案。我的测试是在 Tomcat 8 上使用 Mojarra jsf 2.2.4 和 primefaces-5.3 完成的
    • 嗨,拉维。您无需将“void setTextAreaInfoMessage()”的方法签名更改为“void setTextAreaInfoMessage(AjaxBehaviorEvent e)”。我将 GlassFish 4.1.1 与 Mojarra 2.2.12 一起使用。真的,我的想法已经用完了。
    • 嗨,Roland,我确实在一个新的 glassfish-4.1.1 实例和 Mojarra 2.2.12(glassfish 中可用的 jar)中进行了测试。使用 lib 中唯一的 jar 是 primefaces-5.3.jar。
    • 嗨@Ravi。谢谢你的时间。有趣的是,我们使用相同的环境并获得不同的结果。在我们的讨论中,我意识到纯 JavaScript 会是更好的解决方案。没有客户端-服务器通信会导致更快的解决方案和更健壮的代码。作为新手,我对 jsf/primefaces 方法有点失望。我认为这些框架是为了让开发人员的生活更轻松,但事实证明,即使是最简单的任务也并非易事,至少对我来说是这样。
    猜你喜欢
    • 2017-12-24
    • 2011-03-31
    • 2023-02-18
    • 2019-03-07
    • 2020-04-18
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 2020-04-06
    相关资源
    最近更新 更多