代码之家  ›  专栏  ›  技术社区  ›  Malin

如何处理xp:checkboxgroup的值

  •  1
  • Malin  · 技术社区  · 7 年前

    在Xpage中,我有一个复选框组,其中有一个选项:

    <xp:checkBoxGroup id="cbSignUp"
        value="#{viewScope.interested}">
        <xp:selectItem itemLabel=""
            itemValue="true" />
        <xp:eventHandler event="onchange"
            submit="true" refreshMode="partial" refreshId="pnlUpdate" />
    </xp:checkBoxGroup>
    

    当复选框最初未被触摸时,ViewScope不可用。

    当我选中该框时,ViewScope的值为true(感兴趣的[0]true)

    取消选中该框时,ViewScope的值为空列表(感兴趣的(空列表))。

    这里有什么逻辑吗?

    基于检查器,我想在panel pnlupdate中显示或隐藏一个编辑框。

    现在我有

    if (null == viewScope.get("interested")){
        return false;
    } else{
        return true;
    }
    

    但当ViewScope包含空列表时,这不起作用。

    我该怎么办?

    我不太清楚复选框的返回值在读取文档时是什么: https://www.openntf.org/xspext/xpages%20extension%20library%20documentation.nsf/xpages-doc/xp_checkBoxGroup.html

    2 回复  |  直到 7 年前
        1
  •  1
  •   shillem    7 年前

    你在等 xp:checkBoxGroup 返回 true false (甚至是布尔值:d)值,但这不是它所做的。可以勾选多个复选框-因此可能有多个值-那么您希望如何表示它们?在这种情况下,作为字符串列表(尽管当使用正确的转换器时,它们可以是任何类型的列表)。

    依托 (request|view|session|application)Scope 这不是一个伟大的实践,实际上它是一种糟糕的拐杖(让我们再次感谢IBM,让我们看看错误的方法)。它会让你对你所写的代码很随便,最终它会像在这种情况下咬你一样咬你。我的意思是,特别是对于列表或映射,您希望返回的是一个一致的值,而不需要额外的空检查代码(最佳实践表明,您应该使用 Collections.emptyList() Collections.emptyMap() 如果列表没有初始化,或者您不需要懒惰地加载它),但是,正如我们前面所说,这是一种强制错误,因为您可以随意抛出 viewScope. 参考和思考都会很好。

    因为你知道你在使用 viewScope -或者其他范围——为什么不使用框架知道如何做得最好的东西?管理豆类!

    在这一点上,您可以编写合理的防御代码,这将始终帮助您完成以下任务:

    菜豆

    public class MyViewScopedBean implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        private List<String> sweets;
    
        public List<String> getSweets() {
            if (sweets == null) {
                sweets = new ArrayList<String>();
            }
    
            return sweets;
        }
    
        public void setSweets(List<String> sweets) {
            this.sweets = sweets;
        }
    
    }
    

    XSP

    上面的bean引用为 bean :

    <h3>Select the sweets</h3>
    
    <xp:div id="containerSweetForm">
        <xp:checkBoxGroup id="checkBoxGroup1" value="#{bean.sweets}">
            <xp:selectItem itemLabel="Biscuit" itemValue="biscuit" />
            <xp:selectItem itemLabel="Ice cream" itemValue="icecream" />
            <xp:selectItem itemLabel="Pie" itemValue="pie" />
        </xp:checkBoxGroup>
    
        <xp:button value="Tell me the sweets" id="button1">
            <xp:eventHandler event="onclick" submit="true"
                execMode="partial" execId="containerSweetForm" refreshMode="partial"
                refreshId="containerSweets" />
        </xp:button>
    </xp:div>
    
    <h3>Selected sweets</h3>
    
    <xp:div id="containerSweets">
        <xp:text value="#{bean.sweets}" />
    </xp:div>
    

    列表中的是所有用其表示的勾选复选框 itemValue 属性。

        2
  •  1
  •   Patrick Kwinten    7 年前

    为什么不使用普通复选框?这里只返回真或假:

    <xp:checkBox id="checkBox1" value="#{viewScope.aScope}">
                                    <xp:eventHandler event="onclick"
                                        submit="true" refreshMode="partial" refreshId="pnlEscHighRisk">
                                    </xp:eventHandler></xp:checkBox>