ajax listener inside conditionally rendered element not working
这是我的问题的测试用例:
测试豆:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
@ManagedBean
@ViewScoped public class TestBean implements Serializable { private static final long serialVersionUID = -2329929006490721388L; private List<TestObject> testObjects; public TestBean(){ public void testAjaxListener(int id){ //+getters/setters |
测试对象
1
2 3 4 5 6 7 8 9 10 11 |
public class TestObject {
private int id; private String name; public TestObject(int id, String name){ //+getters/setters |
测试.xhtml:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE html PUBLIC”-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> <html xmlns=”http://www.w3.org/1999/xhtml” |
问题是,actionListener 不会触发(我正在使用 System.out.print 进行检查,如您所见)。当我从 panelGroup 中删除条件渲染时它工作正常,所以我认为这是问题所在 – 但我该如何解决?
我已经阅读了这些主题:
h:commandLink / h:commandButton 未被调用,
f:ajax 在有条件呈现的自定义标记内 – 未调用支持 bean 方法
还有更多,但它并没有解决我的问题:(
请帮忙
这是因为 #{param[‘view’] eq ‘test’} 在 JSF 忙于处理 ajax 提交时没有评估 true。然后它还会再次查询 rendered、disabled 和 readonly 属性,以防止被黑客入侵的请求。 JSF 即不包括 <h:form> 生成的 <form action> URL 中的请求参数。这与未调用或未更新输入值的 commandButton/commandLink/ajax 操作/侦听器方法的第 5 点相匹配。
有几种方法可以解决这个问题。
通过 <f:viewParam>.
将其设置为视图范围 bean 的属性
1
2 3 4 5 |
<f:metadata>
<f:viewParam name=”view” value=”#{testBean.view}” /> </f:metadata> … <h:panelGroup rendered=”#{testBean.view eq ‘test’}”> |
通过<f:param>手动保留参数(你需要把它放在每个提交动作中!):
1
2 3 4 |
<h:commandLink …>
<f:param name=”view” value=”#{param.view}” /> … </h:commandLink> |
将 <h:form> 替换为 OmniFaces <o:form>,它能够告诉 JSF 它必须将表单提交到包含请求参数的 URL:
1
2 3 |
<o:form includeRequestParams=”true”>
… </o:form> |
也可以看看:
- 在 JSF 表单提交上保留 GET 请求查询字符串参数
- 感谢帮助! :D 第 2 点解决了我的问题。不幸的是,第 1 点和第 3 点由于某种原因不起作用:/
- 我错了。 OmniFaces 表格也有帮助;-)
来源:https://www.codenong.com/25700671/