我有一个复合组件,主要由一个 selectManyCheckbox 组件组成。因为它应该以通用方式设计,所以我使用
从调用级别传入 selectItems、ajax 处理等<composite:insertChildren/>
这对大部分内容都非常有效。现在我需要将这个复合组件与转换器一起使用。由于并不总是需要转换器(一种 Omnifaces 的 ListConverter)(有时我想要支持选择项的具体实体的值绑定(bind),有时我不需要),我想传递它in 作为前面提到的部分(例如 selectItems,ajax 事件处理)。
鉴于此,有必要使用转换器标签的“for”属性来引用复合组件内的组件。至少我是这么理解的。
不幸的是,我不知道应该使用什么值。我是否必须包含复合组件的名称(命名容器)?我必须使用 clientId 吗?我尝试了很多组合,但尚未调用转换器。只要我将转换器标签放入复合组件定义中,它就会起作用。
为了让事情更简单,让我们假设我有以下内容:
<composite:interface>
<composite:attribute name="value" required="true"/>
</composite:interface>
<composite:implementation>
[...]
<h:selectManyCheckbox id="#{cc.attrs.id}" value="#{cc.attrs.value}">
<composite:insertChildren/>
</h:selectManyCheckbox>
[...]
</composite:implementation>
该组件应按如下方式使用:
<my:selectManyCheckbox id="myComponent" value="...">
<f:selectItems value="..."/>
<o:converter for="___" converterId="..."/>
</my:selectManyCheckbox>
也许有人可以给我提示应该为“for”属性赋予什么值。
最佳答案
我自己找到了答案。您可以使用以下内容
<composite:interface>
<composite:attribute name="value" required="true"/>
<composite:editableValueHolder name="input_component">
</composite:interface>
<composite:implementation>
[...]
<h:selectManyCheckbox id="input_component" value="#{cc.attrs.value}">
<composite:insertChildren/>
</h:selectManyCheckbox>
[...]
</composite:implementation>
重要的部分是 editableValueHolder 标签。从使用这个复合组件的页面,您现在可以使用
<o:converter for="input_component" converterId="id_of_converter" />
这是适合我的解决方案。我希望这可以帮助其他遇到同样问题的人。
关于jsf - 使用转换器时如何在复合组件中引用组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38919946/