2

我正在创建一个内联文本编辑器。我编写了代码来编辑一个h:ouputText字段 ( h:inputHidden)。作品。因此,我认为我创建了一个复合(小部件),我可以调用我想要更新的每个字段。当然,在我的例子中,这些字段指的是托管 bean,即 PubController MB。

<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>

现在,我有以下任务要完成:

  1. 将 MB 传递给组合(完成)。
  2. 在组合中,创建 div 和具有 MB 属性 id 的隐藏输入字段。

挑战我挣扎的地方:

  • 如何将传递的 PubController 的属性“绑定”到隐藏的输入字段?#{cc.attrs.pubController.title}?好吧,它不应该总是相同的属性。该属性应该由接口属性中传递的内容来选择attrOfMb
  • 在其他情况下,它不需要 PubController。可能是另一个MB。我最初的想法是将接口类型定义为javax.faces.bean.ManagedBean. 另一方面,您如何将传递的 MB“绑定”到输入隐藏字段(反之亦然)。

是否有关于如何完成这些事情的 JSF 模式?

4

1 回答 1

3

在设计复合材料方面,您走错了路。您应该绑定一个 bean属性,而不是整个 bean。

即你不应该有

<my:composite bean="#{bean}" />

但你应该有

<my:composite value="#{bean.value}" title="#{bean.title}" />

一旦你解决了这个问题,你就可以轻松地在任何支持 bean 上重用它。请注意,这也是标准 JSF<h:xxx>组件的工作方式。如果您出于某种不清楚的原因担心“太多”属性,那么只需创建一个可重用的模型类,它又可以是支持 bean 的属性。

<my:composite data="#{bean.data}" />

这样,您可以在复合中进一步使用它,如#{cc.attrs.data.value},#{cc.attrs.data.title}等。

如果您真的非常需要绑定整个 bean,那么我会质疑标记文件或包含文件是否不是您想到的任何功能要求的更好解决方案。一个复合组件应该真正代表一个具有单一职责和点模型值绑定的组件。

也可以看看:

于 2013-08-22T13:11:19.123 回答