如何在ui中呈现h:panelGroup:基于javascript的值重复?

时间:2012-12-04 12:26:14

标签: javascript jsf jsf-2 el rendered-attribute

我在<h:inputText>中得到了布尔值,但我找不到将其转换为rendered的{​​{1}} - 属性的方法。我也没有看到使用bean值的方法,因为每次迭代都需要一个bean值。

这是我的jsf代码:

<h:panelGroup>

这是我的javascript:

<ui:repeat var="item" value="#{itemBean.items}" id="iterateItems" varStatus="iteration">
    <script type="text/javascript">         
        showItem("#{item.id}","#{iteration.index}");
    </script>
    <h:inputText id="rendered"/>
    <h:panelGroup layout="block" rendered="???">
        Iteration #{iteration.index} rendered
    </h:panelGroup>
</ui:repeat>

3 个答案:

答案 0 :(得分:3)

JavaScript在客户端运行并处理从服务器端检索的HTML DOM树(在您的特定情况下由JSF生成)。因此,JavaScript期望您想要显示/隐藏的所需HTML元素始终存在于HTML DOM树中。

JSF在服务器端运行,并根据JSF组件树(“视图”)生成HTML代码。当JSF组件的rendered属性求值为false时,不会为给定组件生成HTML代码,因此HTML DOM树中不会出现任何内容,因此无法选择任何内容通过JavaScript的document.getElementById()

您认为这将成为解决方案的具体功能要求尚不清楚,因此很难为您的具体问题提出正确的解决方案。但是如果你绝对肯定show / hide需要在客户端(通过JavaScript)而不是服务器端(通过JSF)执行,那么你应该使用CSS'display属性来实现这一点您可以在blocknone之间切换。

这是一个基本的启动示例,假设您最初要隐藏它:

<ui:repeat var="item" value="#{itemBean.items}" id="iterateItems" varStatus="iteration">
    <script type="text/javascript">         
        showItem(#{iteration.index});
    </script>
    <h:inputText id="rendered" />
    <div id="foo#{iteration.index}" style="display:none">
        Iteration #{iteration.index} shown
    </div>
</ui:repeat>

function showItem(index) {
    var div = document.getElementById("foo" + index);

    if (someCondition) {
        div.style.display = "block"; // Show it.
    } else {
        div.style.display = "none"; // Hide it.
    }
}

答案 1 :(得分:2)

不要将服务器端脚本与客户端脚本混合使用!

只需使用EL:

<ui:repeat var="item" value="#{itemBean.items}" id="iterateItems" varStatus="iteration">
    <h:panelGroup layout="block" rendered="#{item.id le 1}">
        Iteration #{iteration.index} rendered
    </h:panelGroup>
</ui:repeat>

答案 2 :(得分:1)

这是不可能的:JSF标签 - 特别是渲染的属性在JSF的RenderResponse阶段使用。生成最终HTML后,不再有rendered属性 - 包含该属性的HTML元素是否已呈现。

因此,如果您需要根据客户端的值执行某些操作,则需要将该值传输到服务器。

解决方法是设置css-property display:none。但请注意,这将不会显示元素。它仍然可以在页面源中使用。

如果你正在使用Javascript,你应该看看最终的源代码。 JSF标签已解析,甚至自动生成的ID(如23:58:23)对于某个元素并不总是相同。