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