Добавление составного компонента JSF 2 во время выполнения из базового компонента - PullRequest
3 голосов
/ 01 ноября 2010

Отредактированный вопрос ...

Здравствуйте,

Я хотел бы загрузить файл .xhtml моего составного компонента из базового компонента и динамически добавить его на страницу.Имя файла .xhtml происходит из переменной.

Пример:

public MyBean (){

    String componentFile = "myCompositeComponent.xhtml"

    public String addComponentToPage(){

          //how do that?...

          return null;
    }

} 

Спасибо!

Ответы [ 2 ]

5 голосов
/ 16 ноября 2010

Это не возможно. Составной компонент основан на шаблонах и может использоваться только в представлениях. Лучше всего повторить код 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, чтобы его можно было спрятать и использовать в нескольких местах.

0 голосов
/ 14 ноября 2010

Я не понимаю, почему вы хотите добавить составной компонент из базового компонента. Я предполагаю, что вы хотите сделать его динамически видимым в случае события, но для этого есть AJAX reRender.

Например, вы можете сделать следующее:

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

Свойство renderComponent хранит значение boolean. Вы можете поменять это значение и сделать reRender composite с помощью, например, <a4j:commandLink>.

Ричфайса

Надеюсь, это поможет, Даниэль

...