我们仍处于 JSF 1.2 到 2.0 的迁移场景,并且现在面临与 EL 表达式内使用的 c:set 或 ui:param 变量相关的问题。
以下是事实。有一个按钮作为复合组件:
<cc:interface name="button" shortDescription="A button.">
...
<cc:attribute
name="disabled"
required="false"
default="false"
shortDescription="The disabled flag." />
...
</cc:interface>
<cc:implementation>
<ice:commandButton
...
disabled="#{cc.attrs.disabled}"
... />
</cc:implementation>
现在我们尝试在工具栏中使用这个按钮组件。按钮的禁用状态是在工具栏中使用 c:set 或 ui:param 确定的(我们已经尝试过这两种方法)。
<c:set var="isButtonEnabled" value="#{backingBean.buttonEnabled}" />
or
<ui:param name="isButtonEnabled" value="#{backingBean.buttonEnabled}" />
#{isButtonEnabled}
<ctrl:button
...
disabled="#{!isButtonEnabled}"
... />
这就是我们的问题。如果我们简单地打印出工具栏中“isButtonEnabled”的值,它总是正确的。所以支持豆就可以了。但是当我们尝试将此值传递给复合组件时,它不起作用。 “Disabled”始终被评估为 false。
当然,我们可以直接传递方法表达式(#{!backingBean.isButtonEnabled}),这样就可以正常工作。但在我们的场景中,启用标志的确定要复杂得多,我只是试图使示例尽可能简单。此外,此标志用于工具栏中的多个按钮,因此我们希望通过使用 c:set 或 ui:param 来保持代码的可维护性。这是处理这个问题的错误方法吗?你有什么建议吗?
提前致谢。
阿姆
您的问题是 JSF 中完成值绑定的方式。首选方法是通过调用来检索填充属性的 EL 表达式getValueExpression("attributeName")
。然后这个 EL 表达式可用于获取或设置支持 bean 中的值。由于你没有通过#{!isButtonEnabled}
but #{cc.attrs.disabled}
to ice:commandButton
绑定失败。
我解决了这个问题p:selectOneMenu
通过编写包装来构成 Primefaces 的组件UIComponent
它定义了一个属性wrappedValue
并将该财产传递给p:selectOneMenu
。然后在该属性的 getter 和 setter 中我使用了getValueExpression
检索属性的真实 EL 表达式。
<composite:interface componentType="de.gw2tome.component.valuewrapper">
<composite:attribute name="value" type="de.gw2tome.models.Rarity"
required="true" />
</composite:interface>
<composite:implementation>
<p:selectOneMenu value="#{cc.wrappedValue}"/>
...
</composite:implementation>
@FacesComponent("de.gw2tome.component.valuewrapper")
public class ValueWrapper extends UINamingContainer {
public void setWrappedValue(Object wrappedValue) {
ValueExpression expr = getValueExpression("value");
ELContext ctx = getFacesContext().getELContext();
expr.setValue(ctx, wrappedValue);
}
public Object getWrappedValue() {
ValueExpression expr = getValueExpression("value");
ELContext ctx = getFacesContext().getELContext();
return expr.getValue(ctx);
}
}
现在可以通过以下方式使用该组件:
<g:rarityChooser value="#{itemSearchBean.minRarity}" />
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)