Как создать p:treeNode с произвольными компонентами на основе объектов данных произвольного узла
Предположим, у меня есть класс DataObj
public class DataObj implements Serializable {
private Set<String> values;
private String name;
// default constructor, constructor to pass properties
// getter and setter
}
и установить экземпляр как свойство данных TreeNode
:
@ManagedBean
public ACtrl extends Serializable {
private TreeNode root = new DefaultTreeNode(new DataObj(new HashSet<>(Arrays.asList("a","b")), "some name"));
// default constructor
// getter for root
}
Как я могу создать динамический p:treeNode
s, которые содержат компоненты на основе свойства данных (и его содержимого), например, флажок для каждой строки в DataObj.values
?
В следующем примере показано, как изменить содержимое в зависимости от типа или значения TreeNode.data
, но c:if
а также c:forEach
не работают (я уверен, что они не должны, потому что узел должен быть null
когда они оценены):
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:p="http://primefaces.org/ui" >
<h:form id="form">
<p:tree id="tree" value="#{aCtrl.root}" var="node" >
<p:treeNode id="treeNode">
<h:outputText value="#{node.name}"/>
<p:spinner value="#{node}" rendered="#{node.getClass().getName() eq 'java.lang.Integer'}"/>
<c:if test="#{node.getClass().getName() eq 'DataObj'}">
<c:forEach items="#{node.values}" var="value">
<h:selectBooleanCheckbox value="#{value}"/>
<h:outputText value="#{value.name}"/>
</c:forEach>
</c:if>
</p:treeNode>
</p:tree>
</h:form>
</ui:composition>
Пожалуйста, рассмотрите этот псевдокод... Я знаю, что он не запускается и не компилируется, но он облегчает объяснение моей проблемы и, возможно, ответы:)
Существуют ли альтернативные библиотеки компонентов JSF или расширения для решения этой проблемы?
1 ответ
Использование ui:repeat
необходимо (пробовал это раньше, но не обращал внимания на тот факт, что value
должен быть "Список, массив, java.sql.ResultSet или отдельный объект Java", но не набор ключей ключей карты:) - необходимо добавить .toArray()
в этом случае).
...
<p:treeNode id="treeNode" >
<ui:repeat var="key" value="#{node.type.aValue.keySet().toArray()}">
<h:selectBooleanCheckbox id="checkbox" value="#{node.type.aValue.get(key)}"/>
<h:outputLabel for="checkbox" value="#{key}"/>
</ui:repeat>
</p:treeNode>
...
где node.type.aValue
это Map<String,Boolean>
,
Полезное: