我正在尝试实现一个复合组件,该组件以纯文本显示用户的信息详细信息,或者如果所需的详细信息是当前连接的用户的详细信息,则通过可编辑的输入文本字段显示它们。
我知道al UI Components可以通过呈现的属性呈现,但是那些不是UI组件的那些(例如div)
<div class = "userDetails" rendered = "#{cc.attrs.value.id != sessionController.authUser.id}">
Name: #{cc.attrs.value.name}
Details: #{cc.attrs.value.details}
</div>
<div class = "userDetails" rendered = "#{cc.attrs.value.id == sessionController.authUser.id}">
<h:form>
...
</h:form>
</div>
我知道div没有渲染属性,可能我根本没有采用正确的方法。我可以很容易地使用JSTL标签,但我想避免这种情况。
答案 0 :(得分:54)
用于表示HTML <div>
元素的正确JSF组件是<h:panelGroup>
,layout
属性设置为block
。所以,这应该做:
<h:panelGroup layout="block" ... rendered="#{someCondition}">
...
</h:panelGroup>
或者,将其包裹在<ui:fragment>
:
<ui:fragment rendered="#{someCondition}">
<div>
...
</div>
</ui:fragment>
请注意,当您想要ajax更新有条件渲染的组件时,您应该更新其父组件的ajax。
答案 1 :(得分:9)
自JSF 2.2以来,这很容易。通过使用传递元素,可以将任何HTML元素转换为具有呈现属性的JSF组件。
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:jsf="http://xmlns.jcp.org/jsf">
<div class="userDetails" jsf:rendered="#{cc.attrs.value.id != sessionController.authUser.id}">
Name: #{cc.attrs.value.name}
Details: #{cc.attrs.value.details}
</div>
</html>
在https://jsflive.wordpress.com/2013/08/08/jsf22-html5/#elements
了解详情答案 2 :(得分:8)
我只想用<h:panelGroup>
<h:panelGroup rendered = "#{cc.attrs.value.id != sessionController.authUser.id}">
<div class = "userDetails">
Name: #{cc.attrs.value.name}
Details: #{cc.attrs.value.details}
</div>
</h:panelGroup>
<h:panelGroup rendered = "#{cc.attrs.value.id == sessionController.authUser.id}">
<div class = "userDetails">
<h:form>
...
</h:form>
</div>
</h:panelGroup>
另一种选择是使用Seam(<s:div>
)或Tomahawk(<t:htmlTag>
)库中的组件(如果您已在项目中使用它们)。
请参阅:http://www.jsftoolbox.com/documentation/seam/09-TagReference/seam-div.html
<s:div styleClass = "userDetails" rendered = "#{cc.attrs.value.id != sessionController.authUser.id}">
Name: #{cc.attrs.value.name}
Details: #{cc.attrs.value.details}
</s:div>
<s:div styleClass = "userDetails" rendered = "#{cc.attrs.value.id == sessionController.authUser.id}">
<h:form>
...
</h:form>
</s:div>
或者:http://myfaces.apache.org/tomahawk-project/tomahawk12/tagdoc/t_htmlTag.html
<t:htmlTag value="div" styleClass = "userDetails" rendered = "#{cc.attrs.value.id != sessionController.authUser.id}">
Name: #{cc.attrs.value.name}
Details: #{cc.attrs.value.details}
</t:htmlTag>
<t:htmlTag value="div" styleClass = "userDetails" rendered = "#{cc.attrs.value.id == sessionController.authUser.id}">
<h:form>
...
</h:form>
</t:htmlTag>
答案 3 :(得分:0)
您可以使用其他复合组件。没有div或其他附加标签,正好是您需要的标签。见这个例子:
<table>
<tr>...</tr>
<my:cc rendered="false">
<tr>...</tr>
</my:cc>
<my:cc rendered="true">
<tr>...</tr>
</my:cc>
</table>
我的:cc组件:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:cc="http://xmlns.jcp.org/jsf/composite">
<cc:interface>
</cc:interface>
<cc:implementation>
<cc:insertChildren />
</cc:implementation>
</html>
使用ajax生成以下HTML,完全没有其他标记。
<table><tr>...</tr><tr>...</tr></table>