webentwicklung-frage-antwort-db.com.de

So fügen Sie JSF-Komponenten dynamisch hinzu

Kann ich JSF-Komponenten dynamisch hinzufügen? Ich brauche ein Formular mit einem Button, der dem Formular einen <h:inputText> hinzufügen sollte. Ist das möglich?

Ich weiß, dass dies irgendwie in JavaScript möglich sein sollte. Weiß jemand, wie man das in JSF macht? Ich denke, das Hauptproblem ist, wie ich neue Werte über #{value} erhalte oder setze.

25
ErVeY

Verwenden Sie eine iterierende Komponente wie <h:dataTable> oder <ui:repeat>, um eine dynamisch List von Entitäten anzuzeigen. Erstellen Sie die Bean @ViewScoped, um sicherzustellen, dass die Liste in mehreren Postbacks in derselben Ansicht gespeichert wird, anstatt immer wieder neu erstellt zu werden.

Kickoff-Beispiel mit <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>

Managed Bean:

@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;
    }

}

Modell:

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);
    }

}

Siehe auch:

30
BalusC

Es sollte so sein

Binden Sie ein Form-Tag an die Bean-Eigenschaft


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

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

erstellen Sie bei einem Ereignis eine neue Instanz der Eingabekomponente

HtmlInputText input=new HtmlInputText();

und an das Formular anhängen

myform.getChildren().add(input);
1
corsair

Verwenden Sie h:dataTable, um Elemente dynamisch hinzuzufügen ... Sie haben eine Liste mit einem beliebigen Typ, für den Sie Werte für dataTable angeben möchten.

In h:dataTable... können Sie den Element-Tag einschließen, der in <h:column> erstellt werden soll.

Es wird verwendet, um Elemente zu generieren, die Sie dynamisch erstellen möchten.

0
Arun