在下面的例子中,我能以某種方式告訴JSF <f:attribute>
適用於某些特定組件,就像我可以在<f:convertNumber for="...">
和<f:validator for="...">
中使用for="..."
一樣?我可以告訴JSF是一個f:屬性適用於我的複合材料部件的某些部分?
<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,我用一個自定義的驗證。爲了給該驗證器提供一些參數,使用<f:attribute>
。
接着,使用複合部件與EditableValueHolder
時,我可以(實際上:必須)驗證分配給實際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" ...>
使用的,結合驗證器myparent:myinputtext
,但屬性綁定到myparent
。
解決方法:
的documentation for <f:attribute>
indeed states:
添加屬性與最接近的父UIComponent自定義操作相關的UIComponent。
而且考慮到,下面的複合物成分也按預期工作:
<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;
}
仍然:有更好的解決方案嗎?
(而與此同時測試以及:完美的作品。) – Arjan 2012-03-05 17:43:36
不客氣。 – BalusC 2012-03-05 17:49:07