JSF ui的问题:组合和复合组件

JSF ui的问题:组合和复合组件,jsf,jsf-2,composite-component,Jsf,Jsf 2,Composite Component,我试图找出这是一个JSF/EL问题还是这里出了什么问题 基本上,我想将一个item对象作为ui:param传递给ui:composition,并在其中包含一个按钮(即引导按钮,因此它们实际上是html链接,因此使用commandLink),并让它使用item-param执行一个操作。下面是传递一些参数的ui:composition item.xhtml <ui:include src="comp/item.xhtml"> <ui:param name="item" va

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

基本上,我想将一个item对象作为ui:param传递给ui:composition,并在其中包含一个按钮(即引导按钮,因此它们实际上是html链接,因此使用commandLink),并让它使用item-param执行一个操作。下面是传递一些参数的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”参数时似乎有问题。为了确认这一点,我从组件中取出commandlink并将其放在页面上,并且确信它工作正常。此外,如果我将bt:按钮移到ui:composition之外,它也会在那里工作。最后,如果我使用单引号(如“test”)将项更改为字符串,它也可以工作(出于测试目的,我的操作方法接受一个对象)。基于这3种情况,复合组件似乎在解析传递到组合中的项参数时遇到了问题

下面是item.xhtml中的第一个测试示例(即复合组件与常规JSF commandlink的对比):

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

我和您有同样的需求,并制作了一个复合组件,在其中我像您一样插入了具有视图参数作为属性的子组件,并且该值始终为空,因此我认为这是JSF的问题。

尝试替换

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


我不确定,但我想你应该试着换一个

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


您当前使用的是哪个JSF版本和实现?我使用的是Mojarra 2.1.11,
{item}
来自哪里?从一个重复的组件?如果是,那么哪个?
{item}
来自
{itemVM.item}
。ItemVM只是一个ViewScope托管bean,在本例中不使用ui:repeat。我使用
ui:param name=“item”value=“#{itemVM.item}”
获取该属性并将其传递给item.xhtml组合。我创建了一个item.xhtml组合,因为我想在几页中重用jsf/html代码,所以通过将item作为ui:param传入,我就可以这样做了——当然,直到我遇到这个问题。这似乎是jsf错误。答案描述了一种变通方法。是的,考虑到我的另外两种方法在ui参数上工作得很好,我怀疑这是一个JSF问题,与复合组件和ui参数的评估有关。很高兴听到我不是唯一一个,但希望它能工作。你介意编辑你的答案,使其更容易理解吗?不幸的是,这是一个老项目,我不再有上述测试随时可用。但是,我看不出用“ge”替换“>=”会有什么不同。问题是没有解决'item'参数,而逻辑求值本身在'>='时工作正常。
#{user.compares[item]['id']}