【问题标题】:JSF 2.0 h:inputText inside ui:repeatJSF 2.0 h:inputText 在 ui:repeat
【发布时间】:2011-04-17 00:41:40
【问题描述】:

我应该如何更改以下示例,即在提交命令按钮后 inputText 中的更改值不会消失?我明白它为什么会发生,但我不知道如何解决它。

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

还有豆子:

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

【问题讨论】:

    标签: jsf jsf-2


    【解决方案1】:

    您希望将 bean 放在 view 范围内,以使其在对同一视图的后续请求中保持活动状态。您还想预先填写valueChangeListener 方法而不是getter 方法,因为getter 方法在JSF 的生命周期中被多次调用并且实际上应该只返回 数据。您还想在这里使用f:ajax 通过部分提交而不是通过Javascript 的submit() 提交整个页面来改善用户体验。这是一个启动示例:

    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>
    

    豆子:

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

    项目:

    public class Item {
    
        private String value;
    
        public String getValue() {
            return value;
        }
    
        public void setValue(String value) {
            this.value = value;
        }
    
    }
    

    另见:

    【讨论】:

    • 谢谢,我复制粘贴了您的示例,但在 ajax 调用期间我收到此异常:docs.google.com/document/… 也许我的 JSF 版本又出了问题?
    • 检查服务器启动日志,可能是初始化失败。请注意,对于没有任何组件库的默认 JSF 2.0 安装,web.xml 应该包含FacesServlet 定义。以前的旧/错误实现/库可能会留下一些噪音。
    猜你喜欢
    • 2012-09-29
    • 2011-07-12
    • 1970-01-01
    • 2012-05-29
    • 2013-10-25
    • 1970-01-01
    • 2011-04-30
    • 2013-03-19
    • 1970-01-01
    相关资源
    最近更新 更多