如何使用基于任意节点数据对象的任意组件创建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:ifc: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组件库或扩展来解决这个问题?

ui:repeat的使用是必要的(之前尝试过,但没有注意到value必须是" List, array, java.sql. List ")。ResultSet,或单个java对象",但不是map键的键集:)-在这种情况下需要添加.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.aValueMap<String,Boolean>

有用:

  • c:forEach inside primefaces(例如:p:panelgrid) inside ui:repeat
  • JSTL在JSF2 Facelets…有道理吗?

相关内容

  • 没有找到相关文章

最新更新