【问题标题】:HowTo update Backing Bean before partial refresh如何在部分刷新之前更新 Backing Bean
【发布时间】:2015-12-11 12:19:39
【问题描述】:

我想刷新一个 XPages 控件,它根据 ListBox 的输入显示数据。我使用保存数据的Backing BeanBacking BeanEL Value Binding 连接。 对于计算文本控件,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 设置器永远不会被调用。 计算出来的文本只显示“NO LIST DATA”。

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

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

【问题讨论】:

    标签: java xml xpages


    【解决方案1】:

    找到原因和解决办法!

    当我将 disableValidators 设置为 true 时,setListData 设置器将被调用并且支持 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>
    

    【讨论】:

    • 请始终确认粘贴在问题中的代码是否只是 XPage 上内容的一部分。没有必填字段,因此虽然验证通常是导致更新未运行的最常见原因,但我没有提到这一点。此外,请始终确保刷新区域中有错误面板。否则您或用户无法查看是否发生了验证或数据转换错误。
    • 代码就是我用过的全部。没有必填字段,也没有任何验证器或转换器。
    • 但是 disableValidators 可以工作,所以会出现验证错误。我鼓励您添加一个显示错误控件以了解正在发生的错误。如果它是 List 的转换错误,即使 disableValidators 设置为 true,它仍然会抛出。但是有些东西抛出了错误。 PhaseListener 在每个阶段之前/之后注销消息也会确认它是否在流程验证阶段之后跳过,这也确认 SSJS 不会运行。
    • 我添加了错误显示控件,但没有出现任何消​​息。我猜更新问题与列表框控件有关:如果我添加一个 onclick 按钮,它会根据 textinput 控件的值进行部分刷新,支持 bean 会被更新(为 textinput 启用了部分执行模式)。如果按钮的 execId 指向列表框,则不会发生这种情况。
    【解决方案2】:

    也尝试添加一个setListData(String listData) 方法。 “1”不是一个列表,所以我不希望它调用你当前的方法。我也不确定xp:listBox 是映射到列表还是向量。我希望它映射到一个向量。

    【讨论】:

    • 好主意,我添加了这个方法 - 但它根本没有被调用。此外,如果没有使用 List 对象的 setter 方法,它会被呈现为只读 - 就好像该属性没有 setter。
    猜你喜欢
    • 2019-05-15
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多