如何在部分刷新之前更新Backing Bean

时间:2015-12-11 12:19:40

标签: java xml xpages

我想刷新一个XPages' control,根据ListBox的输入显示数据。我使用保存数据的Backing BeanBacking BeanEL 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

如何部分刷新控件,其值依赖于另一个控件的值绑定数据?

2 个答案:

答案 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。