2

我创建了一个自定义 JSF 标记:

<ui:composition>
    <h:panelGroup>
        <rich:dataScroller id="#{id}" for="#{table}" execute="#{table}"
            page="#{scrollerPage}" render="#{table}-sc1" maxPages="5"
            fastControls="hide" oncomplete="#{onCompl}" scrollListener="#{scrollListenerBean[scrollListenerMethod]}" />
        <h:inputText value="#{scrollerPage}" id="#{table}-sc1" size="2">
            <f:convertNumber integerOnly="true" />
        </h:inputText>
        <h:outputText styleClass="outputText"
            value=" of #{scrollPagesCount}  " />
        <h:commandButton value="GO! " />
    </h:panelGroup>
</ui:composition>

为了传递监听器方法,我使用了一个相当古老的博客中建议的解决方案:

<my:dataScroller id="idDS1" table="table1"
                    scrollerPage="#{bean.navigationHelper.scrollerPage}"
                    scrollPagesCount="#{bean.navigationHelper.scrollPagesCount}"
                    onCompl="initForm();" 
                    scrollListenerBean="#{bean}"
                    scrollListenerMethod="aMethod" />

我的问题是:这是最好的方法吗?如何使该方法可选?

非常感谢您的帮助!再见!

4

1 回答 1

5

我的问题是:这是最好的方法吗?

无论如何,这是唯一的方法,前提是您只能使用标准的 JSF/EL 工具并且不能创建自定义标记处理程序。

但是,您可以创建自定义标记处理程序以将值表达式转换为方法表达式。OmniFaces JSF 实用程序库正好<o:methodParam>用于此目的。另请<o:methodParam>参阅演示页面

然后你可能会像这样:

<my:dataScroller ... scrollListener="#{bean.aMethod}" />

<o:methodParam name="scrollListenerMethod" value="#{scrollListener}" />
<rich:dataScroller ... scrollListener="#{scrollListenerMethod}" />

也可以看看:


如何使该方法可选?

理论上,您可以使用 JSTL 标记有条件地构建视图。就像是:

<h:someComponent>
    <c:if test="#{not empty fooAttribute}">
        <f:attribute name="foo" value="#{fooAttriubte}" />
    </c:if>
</h:someComponent>

但不幸的是,在特殊方法表达式侦听器属性的特殊情况下,这是不可能的。没有任何<rich:scrollListener>东西可以让您将 RichFaces 特定scrollListener作为单独的标签绑定到<rich:dataScroller>. 在不创建自定义标记处理程序的情况下,您可以做的最好的事情是将整个复制到<rich:dataScroller>两个<c:if>s (或 a <c:choose>)中;一个有一个没有scrollListener。这太笨拙了。您最好<my:richScrollListener>为此创建一个自定义标记处理程序,然后您可以将其放置在<c:if>.

于 2012-10-18T11:57:38.420 回答