【问题标题】:Can I make JSF2 skip rendering my custom tag without modifying the tag itself?我可以让 JSF2 在不修改标签本身的情况下跳过呈现我的自定义标签吗?
【发布时间】:2013-07-02 15:23:51
【问题描述】:

我已经使用BalusC's template 开始了我自己的自定义标记处理程序(纯XHTML,无渲染器),我们称之为bean:input - 典型的标签、输入、消息三重奏。它是这样使用的:

<h:panelGrid columns="3">
   <bean:input label="input1:" bean="#{bean1}" property="name" />
   <bean:input label="input2:" bean="#{bean2}" property="name" />
   <bean:input label="input3:" bean="#{bean3}" property="name" />
</h:panelGrid>

问题是,输入是互斥的(即,应该只出现其中一个)。显示哪个输入由视图参数在渲染时确定。我该怎么做?

我不能使用&lt;ui:fragment&gt;,因为这会弄乱panelGrid,在标签上指定rendered="false" 没有效果,我有点犹豫是否将我的标签实现包装在一个大的&lt;c:if test="#{rendered}"&gt; 中 - 有吗一种更好/内置的方式来告诉 JSF 它应该简单地跳过呈现这个特定的标签?


注意:当我使用部分更新重新渲染网格时,&lt;c:if&gt; 标记会做一些有趣的事情(比如渲染一个不应该渲染的标签,而不是相应的输入框)。将rendered 属性添加到组件本身可以解决此问题。

【问题讨论】:

    标签: jsf-2 custom-tags


    【解决方案1】:

    rendered 属性的支持添加到标记文件并将其重新应用于标记文件的内容。

    <bean:input label="input1:" bean="#{bean1}" property="name" rendered="..." />
    

    我有点犹豫是否将我的标签实现包装在一个大的 &lt;c:if test="#{rendered}"&gt;

    这可能很难看,但这是一种方式。

    【讨论】:

    • 这里的“添加支持”是指将其应用于所有子组件或自定义标记文件中的普通&lt;c:if&gt;
    • 您的选择。 &lt;c:if&gt; 在视图构建期间运行。 &lt;h:xxx rendered&gt; 在视图渲染期间运行。如果您有视图范围 bean 并且使用早于 2.1.18 的 Mojarra,那么如果 rendered 属性后面的属性引用视图范围 bean 属性,&lt;c:if&gt; 会中断视图范围 bean。
    • 由于我可以控制环境,我已经升级到 Mojarra-2.1.22,现在在标签文件中使用&lt;c:if&gt;。感谢您的回答!
    猜你喜欢
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    相关资源
    最近更新 更多