Facelet 自定义组件 - 防止渲染 ui:在自定义组件中插入内容

发布于 2024-08-06 01:20:07 字数 1763 浏览 9 评论 0原文

这是我的自定义组件定义:

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

我在 方面遇到问题。它始终呈现。如果disabled=true,我在视图顶部只有 元素。注意:我使用 ui:insert 来传递 jsf 组件,因为我不知道如何将验证器传递给自定义组件内的 h:inputText。

this is my custom component definition:

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

this is how I use it:

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

I have trouble with <ui:insert name="field" />. It renders ALWAYS. If disabled=true I got just <input type="text" disabled="disabled" value="" name="itSIN" id="itSIN"/> element at the top of view. NOTE: I use ui:insert to pass jsf component because I have no clue how to pass validators to an h:inputText inside custom component.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

凡尘雨 2024-08-13 01:20:07

我的猜测是您的 没有按您的预期工作,因为它们在组件树构建阶段进行评估,然后停止。请查看此页面

我个人避免在 Facelet 中使用 JSTL 标签,因为这些警告使得它们违反直觉。您可以使用标签 来代替 ,使用它们的 "渲染”属性。

My guess is that your <c:if> are not working as you expect, because they are evaluated during the component tree building phase and then cease to be. Take a look at this page.

I personally avoid using JSTL tags in facelets, because of these kind of caveats which make them counter-intuitive. You can use instead of <c:if> the tags <ui:fragment> or <h:panelGroup> using their "rendered" attribute.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文