0

我在考虑 JSF 和 AJAX 时遇到了问题。在访问者插入客户 ID 后,我正在尝试更新一些客户详细信息。

首先,摘自 xhmtl 代码:

    <h:form>
    <h:panelGrid columns="2">
        <h:panelGrid columns ="2" border="1" id="customer_grid">
            <h:outputLabel value="#{mbean_msg.reservation_lblCustomerNo}" for = "customer_id"/>
            <h:inputText id = "customer_id" value="#{reservationHandler.customer.customer_id}">
                <f:ajax listener="{reservationHandler.autocompleteCustomerDetails}" 
                    render="customer_grid" />
            </h:inputText>

            <h:outputLabel value="#{mbean_msg.reservation_lblLastname}" for="lastname"/>
            <h:inputText id="lastname" value="#{reservationHandler.customer.lastname}" required ="true" 
                requiredMessage="#{error_msg.errmsgLastname}" validator="#{reservationHandler.validateCustomer}"/>

            <h:outputLabel value="#{mbean_msg.reservation_lblFirstname}" for="firstname"/>
            <h:inputText id="firstname" value="#{reservationHandler.customer.firstname}" required ="true"
                requiredMessage="#{error_msg.errmsgFirstname}" validator="#{reservationHandler.validateCustomer}"/> 

侦听器方法在我的 java 文件 (ReservationHandler.java) 中实现,如下所示:

public void autocompleteCustomerDetails(){
      System.out.println("Auto Complete"); // for testing
}

基本上我正在尝试使用侦听器调用方法autocompleteCustomerDetails 。不幸的是,这个方法永远不会被调用。无论如何,渲染似乎工作得很好,因为其他inputTexts更新自己(可见)。

有谁知道,为什么不叫听众?

4

2 回答 2

8

目前显示的代码有两个问题:

第一的,

<f:ajax listener="{reservationHandler.autocompleteCustomerDetails}" />

这不是有效的 EL 表达式。EL 表达式的形式为#{}, not {}。相应地修复它:

<f:ajax listener="#{reservationHandler.autocompleteCustomerDetails}" />

第二,

public void autocompleteCustomerDetails() {

这不是<f:ajax listener>. 标签文档清楚地说明了以下内容:

签名必须匹配public void processAjaxBehavior(javax.faces.event.AjaxBehaviorEvent event) throws javax.faces.event.AbortProcessingException

所以,你忘记了争论。相应地添加它。对于throws未经检查的异常,声明不是强制性的,因此我们可以将其省略。

public void autocompleteCustomerDetails(AjaxBehaviorEvent event) {

或者,如果你真的打算去掉这个参数,那么你应该在 EL 方法表达式中加上括号:

<f:ajax listener="#{reservationHandler.autocompleteCustomerDetails()}" />

请注意,这仅在您的容器支持 EL 2.2 时才有效。

于 2012-12-23T16:55:27.530 回答
0

尝试这个:

<f:ajax listener="{reservationHandler.autocompleteCustomerDetails()}" 
                render="customer_grid" />

或将方法更改为:getAutoCompleteCustomerDetails

只是为了测试...

无论如何,您不允许使用任何 jsf 的组件库吗?喜欢素面?它以如此简单的方式完成工作......

无论如何,对于primefaces,我会这样做:

 <p:ajax event="blur" listener="#{prospectoRadarController.atualizarRadar(data)}" update=":mainForm:painelRadar" />

另一个猜测是,将 execute="@this" 添加到 ajax 标志...

对不起,这些都是疯狂的猜测,但我真的很想帮忙。请反馈!

于 2012-12-23T12:25:25.937 回答