【问题标题】:How to dynamically add JSF components如何动态添加 JSF 组件
【发布时间】:2016-08-27 18:44:40
【问题描述】:

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

我知道这在 JavaScript 中应该是可能的。有人知道如何在 JSF 中做到这一点吗?我认为主要问题是如何通过#{value} 获取或设置新输入的值。

【问题讨论】:

    标签: jsf jsf-2 dynamic-forms


    【解决方案1】:

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

    使用<h:dataTable> 的启动示例(使用<ui:repeat> 时只需将<h:dataTable> 替换为<ui:repeat>,并将<h:column> 替换为例如<li><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>
    

    托管 bean:

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

    另见:

    【讨论】:

    • 谢谢,我也在想同样的事情,只是想知道这是否是最好的方法 = D
    • 是的。唯一的选择是以编程方式创建组件,例如 new HtmlInputText() 等,但这只会导致托管 bean 中出现讨厌和不透明的代码。
    • 嗨,@BalusC,向 Item 类添加字段“name”是否合适?我需要将项目保存到数据库中,并且我也必须从数据库中读取它们。
    • 谢谢,真的很有帮助。
    • 我就是这样做的。但是当我在添加的输入上输入一个新值并点击提交时,支持 bean 上的列表不会更新。有什么问题?我的项目是 List,可以吗?不能改变List上的字符串?
    【解决方案2】:

    应该是这样的

    将表单标签绑定到 bean 属性

    
    <form binding="#{myBean.myform}">...</form>
    
    
    @ManagedBean("myBean")
    public class Bean{
       property HtmlForm myform;
    }

    在事件发生时,创建输入组件的新实例

    HtmlInputText input=new HtmlInputText();

    并附加到您的表单

    myform.getChildren().add(input);

    【讨论】:

    • 请不要自己创建新的组件实例。首选方式是:FacesContext.getCurrentInstance().getApplication().createComponent(HtmlInputText.COMPONENT_TYPE);
    【解决方案3】:

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

    h:dataTable...中,您可以在&lt;h:column&gt;中包含要创建的元素标签

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

    【讨论】:

    • 欢迎来到 Stack Overflow!到目前为止,这个答案似乎并没有在已经给出的答案之上添加任何实质性内容。 Stack Overflow 不是一个每个人都在同意的情况下互相重复的讨论论坛,而是一个问答网站,每个人都对同意投赞成票或对不同意投反对票。如果您获得 15 声望,则可以投赞成票。
    猜你喜欢
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多