我想为h:selectOneMenu
组件编写一个自定义渲染器,并最终利用该类的description
属性UISelectItem
添加一个title
又名工具提示,以遵循https://stackoverflow.com/a/25512124/3280015和http://baluscf:selectItems
中的 BalusC 的深刻指南.blogspot.de/2008/08/styling-options-in-hselectonemenu.html。
现在我确实com.sun.faces.renderkit.html_basic.MenuRenderer
在自己的 中扩展了,CustomMenuRenderer
用faces-config.xml
renderOption
Responsewriter
String titleAttributeValue = (String) component.getAttributes().get("title");
if (titleAttributeValue != null) {
String indexKey = component.getClientId(context)
+ "_currentOptionIndex";
Integer index = (Integer) component.getAttributes().get(indexKey);
if (index == null) {
index = 0;
}
component.getAttributes().put(indexKey, ++index);
}
我不太确定我做对了,indexKey
或者我是否需要它作为 title 属性,或者应该使用 awriter.writeAttribute("title", titleAttributeValue, null);
代替,因为我没有像 optionClasses 教程中那样的列表,但代码到目前为止有效!
在实际的视图定义用例中,我做了:
<h:selectOneMenu value="#{cc.data}">
<f:attribute name="title" value="outerTEST" />
<c:forEach items="#{cc.list}" var="val">
<f:selectItem value="#{val}" itemValue="#{val}" itemLabel="#{val.label}">
<f:attribute name="title" value="innerTEST #{val.description}" />
</f:selectItem>
</c:forEach>
</h:selectOneMenu>
(我只是把#{val.description}
那里的标题值澄清我的意图,它目前仍然是空的,我将不得不考虑稍后如何填充每个元素,但为了这个问题,我们可以假设它已经被填充。 )
但是现在我"outerTEST"
在浏览器中生成的 XHTML 中的选项的标题属性中得到了正确显示,但我没有看到任何"innerTEST"
应该和应该是个人的,selectItem
而这最终是关于.
我了解f:selectItem
andf:selectItems
组件没有自己的渲染器,但选项的渲染通常由MenuRenderer
via 其renderOption
方法处理。
但是,我将如何将单独的标题添加到单独的 selectItems 中?
谢谢