我正在创建一个内联文本编辑器。我已经编写了编辑单个h:ouputText
字段(h:inputHidden
)的代码。作品因此,我认为我创建了一个复合(小部件),可以为我想要更新的每个字段调用它。当然,在我的例子中,这些字段指的是托管bean,即PubControllerMB。
<composite:interface name="inlineEditor">
<composite:attribute name="attrOfMb" required="true"
type="java.lang.String" />
<composite:attribute name="pubController" required="true" type="com.playground.webapp.controller.PubController"/>
</composite:interface>
现在,我要完成以下任务:
- 将MB传递给复合(完成)
- 在复合中,创建div和具有MB属性id的隐藏输入字段
我奋斗的挑战:
- 如何将传递的PubController的属性"绑定"到隐藏的输入字段#{cc.attrs.pubController.title}?嗯,它不应该总是相同的属性。该属性应该由在接口属性
attrOfMb
中传递的内容来选择 - 在其他情况下,它不一定是PubController。可能是另一个MB。我最初的想法是将接口类型定义为
javax.faces.bean.ManagedBean
。另一方面,如何将传递的MB"绑定"到输入隐藏字段(反之亦然)
有关于如何完成这些事情的JSF模式吗?
在设计组合时走错了路。您应该绑定一个bean属性,而不是整个bean。
也就是说,你不应该有
<my:composite bean="#{bean}" />
但是你应该有
<my:composite value="#{bean.value}" title="#{bean.title}" />
一旦解决了这个问题,就可以在任何后台bean上轻松地重用它。请注意,这也是标准JSF <h:xxx>
组件的工作方式。如果你担心";太多";属性,然后只创建一个可重用的模型类,该模型类又可以是backingbean的属性。
<my:composite data="#{bean.data}" />
通过这种方式,您可以在复合中进一步使用它,如#{cc.attrs.data.value}
、#{cc.attrs.data.title}
等。
如果您真的,真的需要绑定整个bean,那么我会质疑标记文件或包含文件是否不是满足您所想的任何功能需求的更好解决方案。复合组件应该真正代表具有单个责任和模型值绑定点的组件。
另请参阅:
- 何时使用<ui:include>,标签文件、复合组件和/或自定义组件