gpt4 book ai didi

java - 我可以告诉 JSF 一个 f :attribute applies to some part of my composite component?

转载 作者:行者123 更新时间:2023-11-29 06:02:48 25 4
gpt4 key购买 nike

在下面的示例中,我能否以某种方式告诉 JSF <f:attribute>适用于某些特定组件,就像我可以使用 for="..."<f:convertNumber for="..."><f:validator for="...">

<mytags:myCcInputWithValueHolder id="myparent" item="#{myBean.myDouble}" >
<f:convertNumber minFractionDigits="2" for="myinput"/>
<f:validator validatorId="bindableDoubleRangeValidator" for="myinput"/>
<f:attribute name="minimum" value="#{30.00}"/>
<f:attribute name="maximum" value="#{39.99}"/>
</mytags:myCcInputWithValueHolder>


背景:

正在关注 BalusC's solution to a JSF issue ,我使用自定义 validator 。要为该 validator 提供一些参数,<f:attribute>被使用。

接下来,当使用带有 EditableValueHolder 的复合组件时我可以(事实上:必须)将 validator 分配给实际的 h:inputText .但是我没有对 f:attribute 做同样的事情s,所以这些被添加到调用父组件。例如:

<composite:attribute name="item" .../>
<composite:editableValueHolder name="myinput" targets="myinputtext"/>
:
<h:inputText id="myinputtext" value="#{cc.attrs.item}">
<!-- <composite:insertChildren /> doesn't change anything -->
</h:inputText>

...与<f:validator for="myinput" ...>一起使用如本文顶部所示,将 validator 绑定(bind)到 myparent:myinputtext , 但属性绑定(bind)到 myparent .


解决方法:

documentation for <f:attribute> indeed states :

Add an attribute to the UIComponent associated with the closest parent UIComponent custom action.

鉴于此,以下复合组件也可以按预期工作:

<composite:attribute name="item" .../>
<composite:attribute name="min" .../>
<composite:attribute name="max" .../>
:
<h:inputText id="myinput" value="#{cc.attrs.item}">
<f:convertNumber minFractionDigits="2"/>
<f:validator validatorId="bindableDoubleRangeValidator"/>
<f:attribute name="minimum" value="#{cc.attrs.min}"/>
<f:attribute name="maximum" value="#{cc.attrs.max}"/>
</h:inputText>

...与:

<mytags:myCcInputWithValidator 
item="#{myBean.myDouble}" min="#{30.00}" max="#{39.99}"/>

此外,我可以轻松扩展 BalusC's BindableDoubleRangeValidator递归到父组件中以获取值:

Object getAttribute(FacesContext c, UIComponent component, String name) {
Object result = component.getAttributes().get(name);
if (result == null && component.getParent() != null) {
result = getAttribute(c, component.getParent(), name);
}
return result;
}

仍然:有更好的解决方案吗?

最佳答案

这确实令人讨厌。 <f:attribute>确实特定于最近的 parent UIComponent .如果您将它嵌套在复合 Material 中,那么它将特定于复合 Material 组件本身。一种方法是将属性从复合 Material 复制到有问题的输入组件:

<h:inputText id="myinputtext" value="#{cc.attrs.item}">
<f:attribute name="minimum" value="#{cc.attrs.minimum}"/>
<f:attribute name="maximum" value="#{cc.attrs.maximum}"/>
</h:inputText>

这样您问题中的第一个代码片段就可以工作了。

关于您的最后一个代码片段,更简单的方法是通过 UIComponent#getCompositeComponentParent() 获取复合组件父级相反。

Object getCompositeParentAttribute(UIComponent component, String name) {
UIComponent composite = UIComponent.getCompositeComponentParent(component);
return composite.getAttributes().get(name);
}

毕竟,我只是选择一个新的合成,如果有必要,在 <ui:decorate> 的帮助下使用与原始合成相同的模板。 .复合 Material 旨在最大程度地减少重复的样板文件。

<my:inputDouble value="..." min="..." max="..." />

<cc:implementation>
<ui:decorate template="/WEB-INF/templates/someCommonTemplate.xhtml">
<ui:define name="input">
<h:inputText id="myinput" value="#{cc.attrs.value}">
<f:convertNumber minFractionDigits="2" />
<f:validator validatorId="bindableDoubleRangeValidator"/>
<f:attribute name="minimum" value="#{cc.attrs.min}"/>
<f:attribute name="maximum" value="#{cc.attrs.max}"/>
</h:inputText>
</ui:define>
</ui:decorate>
</cc:implementation>

关于java - 我可以告诉 JSF 一个 f :attribute applies to some part of my composite component?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9534600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com