Ajax @ViewScope中未调用嵌套jsf侦听器
目前我有一个类似的问题Ajax @ViewScope中未调用嵌套jsf侦听器,ajax,jsf,listener,Ajax,Jsf,Listener,目前我有一个类似的问题 在解决了这个问题后,我将Mojarra升级到2.1.16版。 在我实现下面提到的视图之前,一切都很好。 代码被简化为基本内容 xhtml: //侦听器被称为 //没有调用侦听器! 豆子: @ManagedBean(name=“testBean”) @视域 公共类TestBean{ 私人收藏测试列表; 公共集合getTestList(){ 返回这个.testList; } //听众 公共void testListener(){ ... } } 即使我将ui:r
在解决了这个问题后,我将Mojarra升级到2.1.16版。
在我实现下面提到的视图之前,一切都很好。
代码被简化为基本内容
xhtml:
//侦听器被称为
//没有调用侦听器!
豆子:
@ManagedBean(name=“testBean”)
@视域
公共类TestBean{
私人收藏测试列表;
公共集合getTestList(){
返回这个.testList;
}
//听众
公共void testListener(){
...
}
}
即使我将
ui:repeat
更改为c:forEach
,问题也是一样的如果我使用
@SessionScope
而不是@ViewScope
,第二个commandLink(在迭代中)调用侦听器。但是我想避免在这个bean中使用@SessionScope
。关于这个问题的原因和如何处理,你有什么提示吗?你能在
@PostConstruct
方法上设置断点,看看在单击ui:repeat
内的链接后是否调用它吗?只是检查是否在AJAX请求上重新创建了bean。是的,在两个AJAX请求上都重新创建了bean。因此,重新初始化的集合包含的对象不是用ui:repeat
列出的对象。这意味着jsf无法在dom树中找到集合的对象,因此不会调用侦听器的嵌套对象!?但是c:forEach
不应该避免这个问题吗?你能发布整个页面的代码吗?
<form>
<div>
// listener is called
<h:commandLink value="test1">
<f:ajax event="click" listener="#{testBean.testListener}" />
</h:commandLink>
<ui:repeat var="testList" value="#{testBean.testList}">
// listener is not called !
<h:commandLink value="test2">
<f:ajax event="click" listener="#{testBean.testListener}" />
</h:commandLink>
</ui:repeat>
</div>
</form>
@ManagedBean(name="testBean")
@ViewScoped
public class TestBean {
private Collection<TestObj> testList;
public Collection<TestObj> getTestList() {
return this.testList;
}
// the listener
public void testListener() {
...
}
}