我想刷新一个XPages' control,根据ListBox的输入显示数据。我使用保存数据的Backing Bean
。 Backing Bean
由EL Value Binding
连接。
对于Computed Text Control,Backing Bean返回listData
属性的第一个选定值。
public class BackingBean implements Serializable {
private static final long serialVersionUID = 1L;
private List listData;
private String displayData;
public BackingBean() {}
public List getListData() {
System.out.println("getListData()");
return listData;
}
public void setListData(List listData) {
System.out.println("setListData()");
this.listData = listData;
}
public String getDisplayData() {
System.out.println("getDisplayData()");
if(listData != null && listData.size() > 0) {
return (String) listData.get(0);
}
return "NO LIST DATA";
}
}
这是我的XPage代码:
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"
xmlns:xe="http://www.ibm.com/xsp/coreex">
<xp:div id="refreshMe">
<xp:listBox id="listBox1">
<xp:this.value><![CDATA[#{backingBean.listData}]]></xp:this.value>
<xp:selectItem itemLabel="Value 1"></xp:selectItem>
<xp:selectItem itemLabel="Value 2"></xp:selectItem>
<xp:eventHandler event="onchange" submit="true" refreshMode="partial" refreshId="refreshMe">
</xp:eventHandler>
</xp:listBox>
<xp:text escape="true" id="computedField1" value="#{backingBean.displayData}"></xp:text>
</xp:div>
</xp:view>
问题是,在部分刷新时,数据将被发送到服务器,但是从不调用setListData setter。 计算文本仅显示&#34; NO LIST DATA&#34;。
view:_id1:listBox1:Value 1 // <-- selected option is sent to the server
$$viewid:!e9x9cl6xse!
$$xspsubmitid:view:_id1:_id298
$$xspexecid:
$$xspsubmitvalue:
$$xspsubmitscroll:0|0
view:_id1:view:_id1
如何部分刷新控件,其值依赖于另一个控件的值绑定数据?
答案 0 :(得分:1)
当我将disableValidators
设置为true
时,将调用setListData
setter并更新Backing Bean。
<xp:listBox id="listBox1">
<xp:this.value><![CDATA[#{controller.listData}]]></xp:this.value>
<xp:selectItem itemLabel="Value 1"></xp:selectItem>
<xp:selectItem itemLabel="Value 2"></xp:selectItem>
<xp:eventHandler event="onchange" submit="true" refreshMode="partial" refreshId="refreshMe" disableValidators="true"></xp:eventHandler>
</xp:listBox>
说实话,我还想使用XSP.partialRefreshPost
更新数据。当我尝试这个时,我无法开箱即用。
但Sven Hasselbach为此发布了一个解决方案:
https://stackoverflow.com/a/21931796/4735030
(简而言之:实现一个按需禁用验证的PhaseListener。)
使用XSP.partialRefreshPost
的事件处理程序如下所示:
<xp:eventHandler event="onchange" submit="false">
<xp:this.script><![CDATA[
XSP.partialRefreshPost(#{id:refreshMe}', {'params': {'disableValidation':true}});
]]></xp:this.script>
</xp:eventHandler>
答案 1 :(得分:0)
尝试添加setListData(String listData)
方法。 &#34; 1&#34;不是列表,所以我不希望它调用您当前的方法。我也不确定xp:listBox
是映射到List还是Vector。我希望它能映射到Vector。