widget中的widgetVar名称冲突在多个cc:renderFacet中的Primefaces中

时间:2013-01-09 10:57:24

标签: jsf-2 primefaces

我有复合组件,其中我有工具栏数据表。我还定义了 facet ,其中包含一个用于处理数据表中数据的表单。用户为不同类型的数据定义该方面。现在,我有问题,因为我多次渲染该面,现在我对Primefaces组件的widgetVar名称有冲突。多次使用 insertChildren 是不可能的,所以我认为这只是可能的解决方案。另外,我不想强​​迫组件的用户定义10个方面并写入ui:include 10次。有没有其他方法可以在复合组件中插入一些facelet代码,或者有没有办法将参数传递给facet,并使用该参数动态创建widgetVar?

3 个答案:

答案 0 :(得分:2)

好的,过了一段时间我才成功做了我想做的事。首先,我有一些像这样的复合组件:

<cc:interface>
  <!-- Attributes definition -->
  <cc:facet name="form"/>
</cc:interface>

<cc:implementation>
  <p:dialog><f:subview id="detailSubview1"><cc:renderFacet name="form"/></f:subview></p:dialog>
  <p:dialog><f:subview id="detailSubview2"><cc:renderFacet name="form"/></f:subview></p:dialog>
  <!-- There is some more renderFacets but this is enough -->
</cc:implementation>

如果我在表单中有p:selectOneMenu,但没有任何widgetVar定义,则widgetVar的所有内容都具有相同名称,这是一个问题。

所以,我完全改变了这一点,我将这个复合组件转换为ui:composition并在我的页面中进行装饰。在这种情况下,小部件变量是根据需要生成的,具有不同的名称,因为它们位于不同的命名容器中。

答案 1 :(得分:1)

事实上,widgetVar在JavaScript中用于标识组件。因此,widgetVar在页面中必须是唯一的。你必须自己申报。

如果你想创建一个自定义组件,我认为可能比ui:define / ui:include更适合你,你可能想要这样做:

假设我们要创建一个组件,使p:commandButtonh:outputText呈现相同的值(无论出于何种原因)。您在名为[deployed-root]/resources/example的目录customComponent.xhtm中创建了一个XHTML页面:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui"
    xmlns:c="http://java.sun.com/jsf/composite">
    <c:interface>
        <c:attribute name="text" required="true" />
    </c:interface>
    <c:implementation>
        <h:outputText value="#{cc.attrs.text}" />
        <p:commandButton value="#{cc.attrs.text}" />
    </c:implementation>
</html>

然后要在另一个页面中使用它,您必须定义命名空间xmlns:e="http://java.sun.com/jsf/composite/example",然后您可以像这样引用自定义组件:<e:customComponent text="some text here"/>

还应该注意,在自定义组件中声明表单是不好的做法。这极大地影响了使用的灵活性,因为表格不能嵌套。

答案 2 :(得分:0)

PrimeFaces可以生成wigetVar,因此您不必这样做。

从3.4用户指南:

<p:dialog id="dlg">
    <!-- contents -->
</p:dialog>
<p:commandButton type="button" value="Show" onclick="#{p:widgetVar('dlg')}.show();"/>

这是为了在命名容器中工作,所以它应该在复合组件中工作得很好,<ui:repeat/><h:dataTable/>等。