考虑到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}"/>
listener方法在我的java文件(ReservationHandler.java)中实现,如:
public void autocompleteCustomerDetails(){
System.out.println("Auto Complete"); // for testing
}
基本上我试图用Listener调用方法 autocompleteCustomerDetails 。不幸的是,从未调用此方法。无论如何,渲染似乎工作正常,因为其他 inputTexts 自我更新(可见)。
是否有人有想法,为什么不调用听众?
答案 0 :(得分:6)
到目前为止,代码中存在两个问题:
首先,
<f:ajax listener="{reservationHandler.autocompleteCustomerDetails}" />
这不是有效的EL表达式。 EL费用的格式为#{}
,而不是{}
。相应地修复它:
<f:ajax listener="#{reservationHandler.autocompleteCustomerDetails}" />
其次,
public void autocompleteCustomerDetails() {
这不是<f:ajax listener>
的方法表达式的有效默认签名。 tag documentation清楚地说明了以下内容:
签名必须与
public void processAjaxBehavior(javax.faces.event.AjaxBehaviorEvent event) throws javax.faces.event.AbortProcessingException
匹配。
所以,你忘记了这个论点。相应地添加它。 <{1}}声明对于未经检查的例外不是强制性的,因此我们可以将其删除。
throws
或者,如果你真的想要摆脱这个论点,那么你应该把括号放在EL方法表达式中:
public void autocompleteCustomerDetails(AjaxBehaviorEvent event) {
请注意,仅当您的容器支持EL 2.2时才有效。
答案 1 :(得分:0)
试试这个:
<f:ajax listener="{reservationHandler.autocompleteCustomerDetails()}"
render="customer_grid" />
或将方法更改为: getAutoCompleteCustomerDetails
仅供测试...
无论如何,你不允许使用任何jsf的组件库?像素面一样? 它以如此简单的方式完成工作......
无论如何,对于素数,我会这样做:
<p:ajax event="blur" listener="#{prospectoRadarController.atualizarRadar(data)}" update=":mainForm:painelRadar" />
另一个猜测是,将execute =“@ this”添加到ajax标志......
对不起,这些都是疯狂的猜测,但我真的很想帮忙。 请反馈!