32

我可以动态添加 JSF 组件吗?我需要一个带有按钮的表单,该按钮应该<h:inputText>在表单中添加一个。这可能吗?

我知道这在 JavaScript 中应该是可能的。有人知道如何在 JSF 中做到这一点吗?我认为主要问题是如何通过#{value}.

4

3 回答 3

36

使用类似<h:dataTable>或的迭代组件<ui:repeat>来显示动态大小List的实体。制作 bean@ViewScoped以确保在同一视图上的回发中记住列表,而不是一遍又一遍地重新创建。

开场示例<h:dataTable>(当<ui:repeat>简单地使用替换<h:dataTable><ui:repeat>, 和<h:column>由例如<li>or <div>):

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

托管豆:

@Named
@ViewScoped
public class Bean {

    private List<Item> items;

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

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

}

也可以看看:

于 2010-08-04T20:22:21.783 回答
1

应该是这样的

将表单标签绑定到 bean 属性


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

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

在事件中,创建输入组件的新实例

HtmlInputText input=new HtmlInputText();

并附加到您的表格

myform.getChildren().add(input);
于 2012-03-29T11:24:31.270 回答
0

用于h:dataTable动态添加元素...拥有您想要为 dataTable 提供值的任何类型的列表...

h:dataTable...中,您可以包含要在其中创建的元素标签<h:column>

它将用于生成您想要动态创建的元素。

于 2013-01-24T05:45:40.333 回答