我试图找出这是一个JSF / EL问题还是错在这里。
基本上,我想将一个项目对象作为ui:param传递给一个ui:组合并在里面有一个按钮(即bootstrap按钮,所以它们实际上是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”参数时遇到了问题。为了确认这一点,我将命令链接从组件中取出并放在页面上,确定它有效。此外,如果我在ui:composition之外移动bt:按钮,它也可以在那里工作。最后,如果我使用单引号(如'test')将item更改为字符串,那么它也可以正常工作(出于测试目的,我的action方法需要一个Object)。基于这三种情况,看起来复合组件在解析传递给合成的项参数时遇到问题。
以下是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问题还是这里有问题?也许在复合组件定义中?
答案 0 :(得分:0)
我有与你一样的需求,并制作了一个复合组件,我在其中将视图参数作为属性插入子项,并且值始终为null,因此我认为这是一个JSF问题。
答案 1 :(得分:0)
尝试替换
disabled="#{user.compares[item.id] != null and itemsCtr.numOfCompares >= 100}"
与
disabled="#{user.compares[item.id] != null and itemsCtr.numOfCompares ge 100}"
答案 2 :(得分:0)
我不确定,但我想你应该尝试更换
#{user.compares[item.id]}
与
#{user.compares[item]['id']}