我有以下表格:
<h:form>
<h:inputText size="2" value="#{orderMB.quantity}" />
<h:outputLabel value=" #{orderMB.totalPriceOneItem} €" />
<h:commandButton value="submit" />
</h:form>
我在会话作用域托管bean中有以下方法:
public void setQuantity(int quantity) {
this.quantity = quantity;
setTotalPriceOneItem(quantity* item.getItem().getPrice().doubleValue());
}
我想在输入字段的每次按键时自动更新总价格结果。如何在不按下提交按钮的情况下实现此目的?
答案 0 :(得分:2)
您的代码无法在任何地方执行此操作。它错过了<f:ajax>
。
<h:inputText size="2" value="#{orderMB.quantity}">
<f:ajax event="keyup" render="total" />
</h:inputText>
<h:outputText id="total" value="#{orderMB.totalPriceOneItem} €" />
event
属性可以设置为JSF必须通过ajax提交表单的任何HTML DOM事件,例如click
,keyup
,blur
,{{可以将focus
属性设置为任何需要在ajax提交完成时更新的JSF客户端ID。在这种情况下,它会引用显示总价的组件ID。
请注意,我已将wrong render
替换为<h:outputLabel>
。还要注意的是,setter并不是执行业务逻辑的正确位置(getter也不是!)。最好将setter方法恢复为真正的setter并添加ajax侦听器方法:
<h:outputText>
<f:ajax event="keyup" listener="#{orderMB.updateTotalPriceOneItem}" render="total" />
如果它仍然不起作用,请验证模板中是否有public void updateTotalPriceOneItem() {
totalPriceOneItem = quantity * item.getItem().getPrice().doubleValue();
}
而不是<h:head>
。如果仍然徒劳,请完成commandButton/commandLink/ajax action/listener method not invoked or input value not updated。
那就是说,我强烈建议暂停一下sane JSF 2.x book。以上内容通常已在第1章中介绍过。