2009-09-30 73 views
1

内容,这是我的自定义组件定义:的facelet自定义组件 - 防止渲染UI:插入自定义组件

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:c="http://java.sun.com/jstl/core" 
     xmlns:fn="http://java.sun.com/jsp/jstl/functions"> 
<c:if test="${empty required}"> 
<c:set var="required" value="false" /> 
</c:if> 
<c:if test="${empty disabled}"> 
<c:set var="disabled" value="false" /> 
</c:if> 
<c:if test="${not disabled}"> 
<div id="#{id}DIV"> 
<label for="#{id}" class="portlet-form-label">${label}</label> 
<ui:insert name="field" /> 
<c:if test="${required}">*</c:if> 
<strong class="portlet-msg-error" style="display: none;"><h:message for="#{id}" /></strong> 
</div> 
</c:if> 
</ui:composition> 

这是我如何使用它:

<my:editLineInsert id="itSIN" label="#{label['label.stocks.income']}" tip="#{label['message.default.tooltip']}" disabled="#{engine.disabled['itSIN']}" required="#{engine.required['itSIN']}" > 
<ui:define name="field"> 
<h:inputText id="itSIN" value="#{order.income}" disabled="#{engine.disabled['itSIN']}" required="#{engine.required['itSIN']}" > 
<f:converter converterId="javax.faces.BigDecimal" /> 
<f:validator validatorId="V12DGS6DECS" /> 
</h:inputText> 
</ui:define> 
</my:editLineInsert> 

我有<ui:insert name="field" />麻烦。它总是呈现。如果disabled = true,我只在视图的顶部有<input type="text" disabled="disabled" value="" name="itSIN" id="itSIN"/>元素。注意:我使用ui:insert传递jsf组件,因为我不知道如何将验证器传递给定制组件内的h:inputText。

回答

1

我的猜测是你的<c:if>不像你期望的那样工作,因为它们在组件树构建阶段被评估,然后停止。看看this page

我个人避免在facelets中使用JSTL标签,因为这些注意事项使它们不符合直觉。您可以使用它们的“呈现”属性代替<c:if>代码<ui:fragment><h:panelGroup>