возврат связанного хэш-набора в xpage как многозначный

В моих приложениях я определил свойство объекта как LinkedHashSet. Свойство, которое я заполняю значениями из поля с несколькими значениями:

Vector<String> ctrs = doc.getItemValue("countries");        
LinkedHashSet<String> items = new LinkedHashSet<String>();      
for (int i = 0; i < ctrs.size(); i++){          
    items.add(ctrs.get(i));
}       
employee.setCountry(items);

На XPage я хотел бы отображать значения следующим образом:

<xp:inputText id="inputCountries" value="#{employeeBean.employee.Country}">
    <xp:this.multipleSeparator><![CDATA[#{javascript:var val = getComponent("contractType").getValue();
if (val == "Multi"){
    return ",";
}}]]></xp:this.multipleSeparator>
</xp:inputText>

В зависимости от типа сотрудника это поле может быть однозначным или многозначным.

При просмотре XPage возвращаемое значение отображается следующим образом:

[Швеция, Дания, Эстония]

Конечно, я бы отобразил его как многозначный. Что я должен сделать, чтобы исправить это?


person Malin    schedule 12.04.2017    source источник
comment
Вы пытались использовать xp:inputTextarea (многострочное поле редактирования) вместо xp:inputText?   -  person Knut Herrmann    schedule 12.04.2017
comment
оба я пробовал. Для элемента управления inputTextArea я установил многозначный разделитель \n (вычисляется) и , но здесь тот же результат   -  person Malin    schedule 12.04.2017


Ответы (3)


Если вы преобразуете свой HashSet в массив, он должен работать

Вот пример, первое как одно/второе как поле с несколькими значениями:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">

    <xp:inputText id="singleValue" multipleSeparator=",">
        <xp:this.value><![CDATA[#{javascript:var items:java.util.Set = new java.util.LinkedHashSet();
items.add("Sweden");      
return items.toArray();}]]>
        </xp:this.value>
    </xp:inputText>

    <br></br>
    <br></br>

    <xp:inputText id="multiValue" multipleSeparator=",">
        <xp:this.value><![CDATA[#{javascript:var items:java.util.Set = new java.util.LinkedHashSet();
items.add("Sweden");
items.add("Denmark");  
items.add("Estonia");
return items.toArray();}]]>
        </xp:this.value>
    </xp:inputText>

</xp:view>

Вывод в браузере выглядит так:

Sweden

Sweden,Denmark,Estonia
person Georg Kastenhofer    schedule 12.04.2017
comment
Здравствуйте, Георг, ваш подход работает как шарм. Большое спасибо! - person Malin; 12.04.2017
comment
@Malin Я рад, что смог помочь :) - person Georg Kastenhofer; 12.04.2017

Вы должны использовать List вместо Set.

Кроме того, если вы не используете LinkedHashSet как способ удаления повторяющихся значений из вектора, вы можете просто передать вектор методу setCountry, потому что Vector реализует List:

// setting country method
yourBlock() {
   // It's better to use interface instead of implementation for the variable
   List<String> countries = doc.getItemValue("countries");

   setCountries(countries);
}

Если вы используете LinkedHashSet как способ получить уникальные значения, вам нужно немного изменить приведенный выше код.

// setting country method
yourBlock() {
   List<String> countries = doc.getItemValue("countries");

   setCountries(new ArrayList<String>(new LinkedHashSet<String>(countries)));
}
person shillem    schedule 13.04.2017

Если вы хотите просто просмотреть данные

Вариант 1: разделение значений с помощью @Implode и некоторых разделителей, запятых или <br/> должно работать.

Вариант 2. Используйте повтор с пользовательским рендерингом: несколько вычисляемых текстов, разделов или таблиц.

Если вы хотите изменить данные

Вам нужно использовать повтор. В этом случае вам необходимо реализовать интерфейс Map для вашего компонента, если вы хотите связать входные данные. Полезно прочитать здесь: https://www.mindoo.com/web/blog.nsf/dx/16.07.2009095816KLEBCY.htm?opendocument&comments

person Frantisek Kossuth    schedule 12.04.2017