7

我试图找出这是一个 JSF/EL 问题还是这里有什么问题。

基本上,我想将一个项目对象作为 ui:param 传递给 ui:composition 并在内部有一个按钮(即引导按钮,因此它们实际上是 html 链接,因此使用 commandLink)并让它使用该项目执行操作参数。这是传递了一些参数的 ui:composition item.xhtml。

<ui:include src="comp/item.xhtml">
    <ui:param name="item" value="#{itemVM.item}"/>
    <ui:param name="desc" value="#{true}"/>
</ui:include>

现在我希望这个按钮成为一个复合组件“bt:button”,但是它似乎在解析“item”参数时遇到了问题。为了确认这一点,我从组件中取出命令链接并将其放在页面上,果然它确实有效。此外,如果我将 bt:button 移到 ui:composition 之外,它也可以在那里工作。最后,如果我使用像“test”这样的单引号将项目更改为字符串,它也可以工作(出于测试目的,我的操作方法需要一个对象)。基于这 3 种情况,看起来组合组件在解析传递给组合的项目参数时遇到了麻烦。

这是 item.xhtml 中第一个测试的示例(即,复合组件与常规 JSF 命令链接):

<!- This composite component doesn't Work -->
<bt:button id="cmpBtn" active="#{user.compares[item.id]}"
           disabled="#{user.compares[item.id] != null and itemsCtr.numOfCompares >= 100}"
           styleClass="btn-item-compare btn-small"
           style="margin-bottom:5px"
           action="#{itemsCtr.compare(item)}">
    <i class="#{user.compares[item.id] != null ? 'icon-minus' : 'icon-plus'}"/>
    <h:outputText value="#{user.compares[item.id] != null ? 'Comparing' : 'Compare'}"/>
    <f:ajax render="@this"/>
</bt:button>

<!-- This regular jsf component works -->
<h:commandLink action="#{itemsCtr.compare(item)}" value="Test">
    <f:ajax render="@this"/>
</h:commandLink>

这是我对 bt:button 的复合组件定义:

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:cc="http://java.sun.com/jsf/composite"
      xmlns:f="http://java.sun.com/jsf/core">

<cc:interface componentType="LinkComponent">
    <cc:attribute name="action" targets="button"/>
    <cc:attribute name="value" type="java.lang.String"/>
    <cc:attribute name="active" type="java.lang.Boolean"/>
    <cc:attribute name="title" type="java.lang.String"/>
    <cc:attribute name="styleClass" type="java.lang.String"/>
    <cc:attribute name="disabled" type="java.lang.Boolean"/>
    <cc:attribute name="style" type="java.lang.String"/>
</cc:interface>

<cc:implementation>
    <h:commandLink id="button" binding="#{cc.link}"
                   styleClass="btn #{cc.attrs.active ? 'active' : ''} #{cc.attrs.disabled ? 'disabled' : ''} #{cc.attrs.styleClass}"
                   title="#{cc.attrs.title}" style="#{cc.attrs.style}" disabled="#{cc.attrs.disabled}" value="#{cc.attrs.value}">
        <cc:insertChildren/>
    </h:commandLink>
</cc:implementation>
</html>

我的问题是这是一个 JSF 问题还是这里有什么问题?也许在复合组件定义中?

4

3 回答 3

0

尝试更换

disabled="#{user.compares[item.id] != null and itemsCtr.numOfCompares >= 100}"

disabled="#{user.compares[item.id] != null and itemsCtr.numOfCompares ge 100}"
于 2014-01-02T15:52:02.887 回答
0

我和你有同样的需求,做了一个复合组件,我像你一样在其中插入带有视图参数的子元素作为属性,并且值始终为空,所以我认为这是一个 JSF 问题。

于 2012-09-18T11:37:52.753 回答
0

我不确定,但我想你应该尝试更换

#{user.compares[item.id]}

#{user.compares[item]['id']}
于 2014-01-14T12:07:54.877 回答