Cly*_*rog 1 selectonemenu valuechangelistener primefaces jsf-2
我正在使用Primefaces 3.3.1,并在<p:selectOneMenu>其中选择一个新值。选择新值时,将在处理值的地方调用valueChangeListener方法。像这样:
<h:form>
<p:selectOneMenu id="signature-menu" value="#{objectBuffertBean.loggedInSignature}" effect="fold" style="width: 125px;">
<p:ajax event="change" update="signature-menu"
listener="#{loginBean.changeSignature()}" />
<f:selectItems value="#{signaturesBean.signatures}" />
</p:selectOneMenu>
</h:form>
Run Code Online (Sandbox Code Playgroud)
LoginBean.java:
public void changeSignature(ValueChangeEvent e) {
if (e.getNewValue() != null) {
try {
WebDB db = new WebDB();
SessionHandler.getInstance().
getCurrentObjectBuffert().setSignature(
db.getSignatureBySignatureFromWebDb(
(String) e.getNewValue()
));
} catch (DatabaseException e1) {
e1.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,奇怪的是,当我选择一个新值时,会出现以下异常:
javax.el.MethodNotFoundException: Method changeSignature not found
Run Code Online (Sandbox Code Playgroud)
而且有效!该方法被以某种方式调用,并且正在处理新值!有谁有同样的奇怪并发症吗?
你混淆valueChangeListener的属性UIInput与listener属性<p:ajax>/ <f:ajax>。ValueChangeEvent仅在valueChangeListener属性后面的方法上支持该参数。/ listener属性背后的方法必须带有参数(或什么也没有)。<p:ajax><f:ajax>AjaxBehaviorEvent
所以
public void changeSignature(AjaxBehaviorEvent e) {
if (loggedInSignature != null) {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
要么
public void changeSignature() {
if (loggedInSignature != null) {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,已提交的值已在UIInput组件属性后面的value属性上设置,因此不需要通过事件获取它。这是因为它在调用操作阶段而不是在验证阶段(如)运行valueChangeListener。同样,从valueChangeListener技术上讲,仅当您打算在方法中同时拥有新旧值时,才应使用。
与具体问题无关,的event="change"属性<p:ajax>已经是默认值。您可以忽略它。同样,listener最好省略属性的那些方法括号,因为它不增加任何值。只需使用listener="#{loginBean.changeSignature}"。
| 归档时间: |
|
| 查看次数: |
9673 次 |
| 最近记录: |