4

已编辑问题...

你好,

我想从支持 bean 加载我的复合组件的 .xhtml 文件,并将其动态添加到页面中。.xhtml 文件的名称来自一个变量。

前任。:

public MyBean (){

    String componentFile = "myCompositeComponent.xhtml"

    public String addComponentToPage(){

          //how do that?...

          return null;
    }

} 

谢谢!

4

2 回答 2

6

那是不可能的。复合组件是基于模板的,只能在视图中使用。最好的办法是完全重复您最初在模型的复合组件中编写的 JSF 代码。更好的是创建一个完整@FacesComponent的扩展类UIComponent,并带有@FacesRenderer. 诚然,这是一项乏味且不透明的工作,但通过这种方式,您最终会得到一个组件,该组件可通过单个代码行在视图和模型中重用。

一个 -ugly- 替代方法是将所有可能的组件放在视图中并使用该rendered属性。

<my:component1 rendered="#{bean.myComponentType == 'component1'}" />
<my:component2 rendered="#{bean.myComponentType == 'component2'}" />
<my:component3 rendered="#{bean.myComponentType == 'component3'}" />
...

如有必要,将其包装在 Facelets 标记文件中,以便将其隐藏起来并在多个地方重复使用。

于 2010-11-16T00:09:04.263 回答
0

我不明白您为什么要从支持 bean 添加复合组件。我猜你想让它在发生事件时动态可见,但为此有 AJAX reRender。

例如,您可以执行以下操作:

<h:panelGroup id="composite" rendered="#{myBean.renderComponent}">
    <my:compositecomponent/>
</h:panelGroup>

renderComponent属性存储一个boolean值。您可以切换该值并重新渲染composite,例如 Richfaces's <a4j:commandLink>

希望有帮助,丹尼尔

于 2010-11-14T12:33:22.917 回答