简体   繁体   English

JSF 2.0 h:ui:repeat中的inputText

[英]JSF 2.0 h:inputText inside ui:repeat

How I should change following example that after changes values in inputText not disappears after commandButton was submitted? 我如何更改以下示例,在提交commandButton之后,inputText中的更改值不会消失? I'm understanding why it happens, but I don't know how to fix it. 我理解为什么会这样,但我不知道如何解决它。

<h:form>
    <h:selectOneMenu valueChangeListener="#{foo.selectChanges}" onchange="submit()" >
        <f:selectItem itemValue="5" itemLabel="Five"/>
        <f:selectItem itemValue="10" itemLabel="Ten"/>
    </h:selectOneMenu>

    <ui:repeat value="#{foo.repeatItems}" var="item">
        <div>
            <h:inputText value="#{item.value}"/>
        </div>
    </ui:repeat>

    <h:commandButton value="test" action="#{foo.submit}">
    </h:commandButton>
</h:form>

And bean: 和豆:

public class FooBean {

    private RepeatItem[] repeatItems;

    private String value = "5";

    public String getValue() {
        return value;
    }

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

    public void submit() {

    }

    public void selectChanges(ValueChangeEvent e) {
        value = (String) e.getNewValue();
    }

    public RepeatItem[] getRepeatItems() {
        repeatItems = new RepeatItem[Integer.parseInt(value)];

        for (int i = 0; i < Integer.parseInt(value); i++) {
            repeatItems[i] = new RepeatItem();
        }

        return repeatItems;
    }

    public void setRepeatItems(final RepeatItem[] repeatItems) {
        this.repeatItems = repeatItems;
    }

    public static class RepeatItem {

        private String value;

        public String getValue() {
            return value;
        }

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

You'd like to put the bean in the view scope to keep it alive in subsequent requests to the same view. 您希望将bean放在view范围中,以便在对同一视图的后续请求中保持活动状态。 You'd also like to prefill in the valueChangeListener method instead of the getter method since a getter method is called multiple times in JSF's lifecycle and is actually supposed to only return the data. 您还希望预先填充valueChangeListener方法而不是getter方法,因为在JSF的生命周期中多次调用getter方法,并且实际上应该只返回数据。 You would also like to use f:ajax here to improve user experience by partial submits instead of submitting the whole page by Javascript's submit() . 您还希望在此处使用f:ajax来通过部分提交来改善用户体验,而不是通过Javascript的submit()提交整个页面。 Here's a kickoff example: 这是一个启动示例:

XHTML: XHTML:

<h:form>
    <h:selectOneMenu valueChangeListener="#{bean.prefill}" converter="javax.faces.Integer">
        <f:selectItem itemValue="0" itemLabel="Please select" />
        <f:selectItem itemValue="5" itemLabel="Five"/>
        <f:selectItem itemValue="10" itemLabel="Ten"/>
        <f:ajax event="change" render="items" />
    </h:selectOneMenu>
    <h:panelGroup id="items">
        <ui:repeat value="#{bean.items}" var="item">
            <div><h:inputText value="#{item.value}"/></div>
        </ui:repeat>
    </h:panelGroup>
    <h:commandButton value="submit" action="#{bean.submit}" />
    <h:messages />
</h:form>

Bean: 豆角,扁豆:

@ManagedBean
@ViewScoped
public class Bean {

    private List<Item> items;

    public void prefill(ValueChangeEvent event) {
        Integer count = (Integer) event.getNewValue();
        items = new ArrayList<Item>();
        while (count-- > 0) items.add(new Item());
    }

    public void submit() {
        System.out.println(items);
    }

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

}

Item: 项目:

public class Item {

    private String value;

    public String getValue() {
        return value;
    }

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

}

See also: 也可以看看:

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM