创建参数化多用途自定义 Facelet 标签的最佳方法是什么

发布于 2024-09-19 19:00:53 字数 1313 浏览 5 评论 0原文

我创建了一个 Facelet 标签,用于渲染带有标签的文本输入。 这对于避免一遍又一遍地重复相同的代码非常有帮助。

尽管我正在努力处理这个单个选项卡中的不同用例(日期与文本、必需与非必需、文本区域与普通文本等),但

我最终在我的组件中拥有多个标签,所有标签都或多或少复杂的渲染属性,如下所示:

    <h:inputText    
            onblur="makeNotEmpty(this)"
            onfocus="makeNotEmptyFocus(this)"
            id="#{cid}"
            value="#{value}"
            rendered="#{textarea!='true' and type!='email' and notrequired!='true' and nullablenumber!='true'}"
            style="#{style }"   
            required="true"
            disabled="#{disabled }">        
            <f:validator validatorId="notnull"/>    

    </h:inputText> 
    <h:inputText                    
        onblur="    
            makeNotEmpty(this)"
        onfocus="makeNotEmptyFocus(this)"
        id="#{cid}"
        value="#{value}"
        rendered="#{type=='email'}"
        style="#{style }"
        required="true"
        disabled="#{disabled }">            
        <f:validator validatorId="email" />
        <f:validator validatorId="notnull"/>
    </h:inputText> 

当然,这不是最佳的,而且写起来相当乏味。 我认为的另一个问题是,使用这种方法,我在组件树中拥有多个具有相同 ID 的组件(我不确定这是否是一个问题,因为一次只渲染一个具有相同 ID 的项目,但我看到了一些奇怪的情况)重新创建页面树的问题让我相信这是一个问题)

我正在使用 ICEFaces 1.8.2 (但问题应该与实现无关)。 对此有什么解决办法呢?使用 ?还有别的事吗?谢谢!

I created a Facelet tag for rendering a textinput with a label.
That's very helpful when for avoiding repeating the same code over and over again.

Though I'm struggling with handling different use cases within this single tab (date vs. text, required vs. not required, textarea vs. normal text etc.)

I ended up with having multiple tags within my component all with a more or less complicated rendered attribute, like shown here:

    <h:inputText    
            onblur="makeNotEmpty(this)"
            onfocus="makeNotEmptyFocus(this)"
            id="#{cid}"
            value="#{value}"
            rendered="#{textarea!='true' and type!='email' and notrequired!='true' and nullablenumber!='true'}"
            style="#{style }"   
            required="true"
            disabled="#{disabled }">        
            <f:validator validatorId="notnull"/>    

    </h:inputText> 
    <h:inputText                    
        onblur="    
            makeNotEmpty(this)"
        onfocus="makeNotEmptyFocus(this)"
        id="#{cid}"
        value="#{value}"
        rendered="#{type=='email'}"
        style="#{style }"
        required="true"
        disabled="#{disabled }">            
        <f:validator validatorId="email" />
        <f:validator validatorId="notnull"/>
    </h:inputText> 

Of course that's no optimal and rather tedious to write.
One other problem I think is that using this approach I have multiple components with the same ID in the component tree (I'm not sure if that's a problem as only one item having the same ID is rendered at one time but I saw some strange problems re-creating the page tree making me belive it's a problem)

I'm using ICEFaces 1.8.2 (but the problem should be implementation independent).
What's the solution for this? Using ? Something else? Thanks!

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

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

发布评论

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

评论(1

御弟哥哥 2024-09-26 19:00:54

您可以将 放入 JSTL 中。它将在标签构建期间创建。

<html xmlns:c="http://java.sun.com/jsp/jstl/core">
...
<c:if test="#{type eq email}"><f:validator validatorId="email" /></c:if>

顺便说一句,IceFaces 不是 JSF 实现,它是一个 JSF 组件库,应该在 JSF 实现之上运行。Mojarra 和 MyFaces 是 JSF 实现。

You can put <f:validator> in a JSTL <c:if>. It will be created during tag build time.

<html xmlns:c="http://java.sun.com/jsp/jstl/core">
...
<c:if test="#{type eq email}"><f:validator validatorId="email" /></c:if>

By the way, IceFaces isn't a JSF implementation, it's a JSF component library which is supposed to run on top of a JSF implementation.. Mojarra and MyFaces are JSF implementations.

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