34

我正在尝试实现一个复合组件,该组件要么以纯文本形式显示用户的信息详细信息,要么如果所需的详细信息是当前连接的用户的详细信息,则通过可编辑的输入文本字段显示它们。

我知道所有 UI 组件都可以通过render 属性呈现,但是那些不是 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 标记,但我想避免这种情况。

4

4 回答 4

73

表示 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>

或者当您已经在 J​​SF 2.2+ 上时,将其设为直通元素

<div jsf:rendered="#{someCondition}">

</div>

请注意,当您想要对有条件渲染的组件进行 ajax 更新时,您应该改为对其父组件进行 ajax 更新。

也可以看看:

于 2012-01-11T13:02:50.787 回答
11

从 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

于 2016-04-02T02:47:21.440 回答
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>
于 2012-01-11T09:21:22.823 回答
0

您可以使用其他复合组件。没有 div 或其他附加标签,正是您需要的标签。看这个例子:

<table>
    <tr>...</tr>
    <my:cc rendered="false">
        <tr>...</tr>
    </my:cc>
    <my:cc rendered="true">
        <tr>...</tr>
    </my:cc>
</table>

而 my: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>
于 2015-06-15T23:41:53.250 回答