Как динамически добавлять компоненты JSF - PullRequest
26 голосов
/ 04 августа 2010

Могу ли я добавить компоненты JSF динамически? Мне нужно иметь форму с кнопкой, которая должна добавить один <h:inputText> к форме. Возможно ли это?

Я знаю, что это должно быть возможно в JavaScript как-то. Кто-нибудь знает, как это сделать в JSF? Я думаю, что основная проблема заключается в том, как получить или установить значения новых входов через #{value}.

Ответы [ 3 ]

31 голосов
/ 05 августа 2010

Используйте итеративный компонент, такой как <h:dataTable> или <ui:repeat>, чтобы отобразить List сущностей с динамическим размером. Создайте bean-компонент @ViewScoped, чтобы список запоминался в постбэках одного и того же представления, а не создавался заново снова и снова.

Пример запуска с <h:dataTable>:

<h:form>
    <h:dataTable value="#{bean.items}" var="item">
        <h:column><h:inputText value="#{item.value}" /></h:column>
        <h:column><h:commandButton value="remove" action="#{bean.remove(item)}" /></h:column>
    </h:dataTable>
    <h:commandButton value="add" action="#{bean.add}" />
    <h:commandButton value="save" action="#{bean.save}" />
</h:form>

Управляемый компонент:

@ManagedBean
@ViewScoped
public class Bean {

    private List<Item> items;

    @PostConstruct
    public void init() {
        items = new ArrayList<Item>();
    }

    public void add() {
        items.add(new Item());
    }

    public void remove(Item item) {
        items.remove(item);
    }

    public void save() {
        System.out.println("items: " + items);
    }

    public List<Item> getItems() {
        return items;
    }

}

Модель:

public class Item {

    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String toString() {
        return String.format("Item[value=%s]", value);
    }

}

Смотри также:

1 голос
/ 29 марта 2012

Это должно быть так

Привязать тег формы к свойству компонента


<form binding="#{myBean.myform}">...</form>

@ManagedBean("myBean")
public class Bean{
   property HtmlForm myform;
}

при событии, создать новый экземпляр компонента ввода

HtmlInputText input=new HtmlInputText();

и приложите к своей форме

myform.getChildren().add(input);
0 голосов
/ 24 января 2013

Используйте h:dataTable для динамического добавления элементов ... У вас есть список любого типа, который вы хотите предоставить значения для dataTable ...

В h:dataTable ... вы можете включить тег элемента всоздать внутри <h:column>

Он будет использоваться для создания элементов, которые вы хотите создать динамически.

...