我在<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>
答案 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
属性来实现这一点您可以在block
和none
之间切换。
这是一个基本的启动示例,假设您最初要隐藏它:
<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
)对于某个元素并不总是相同。