Как обрабатывать значение xp: checkBoxGroup - PullRequest
0 голосов
/ 20 сентября 2018

В моей Xpage у меня есть группа флажков с 1 опцией:

<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 недоступен.

Когда я отмечаю флажок, значениеof viewScope имеет значение true (интересуется [0] true)

Когда я снимаю флажок, значение viewScope является пустым списком (интересуется (пустой список))

Есть ли логика дляможно найти здесь?

На основании проверки, я хочу показать или скрыть EditBox на панели 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 ]

0 голосов
/ 20 сентября 2018

Вы ожидаете, что 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.

0 голосов
/ 20 сентября 2018

почему бы не использовать обычный флажок?здесь он возвращает только true или false:

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