假设我有一个班级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
,例如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组件库或扩展来解决此问题?
答案 0 :(得分:0)
ui:repeat
的使用是必要的(之前尝试过,但没有注意value
必须是&#34; List,array,java.sql.ResultSet这一事实,或单个java Object&#34;,但不是一组键映射键:) - 在这种情况下需要添加.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>
。
有用的: