【问题标题】:List elements not updated in c:forEach列出 c:forEach 中未更新的元素
【发布时间】:2013-02-05 02:22:53
【问题描述】:

我为我的数据库开发搜索引擎。我有一个对话框,我从这个对话框中得到了一些输入。最多有 5 个面板,面板有 selectOneMenus、inputTexts 等。 我可以通过按+- 按钮来显示和隐藏输入行。这不是问题。

问题是没有设置 AdvancedSearch 的任何属性。

Browse 类具有以下对象(setter 和 getter 都可以):

private List<String> advSearchCols = new ArrayList<>();
private List<AdvancedSearch> advSearch = new ArrayList<>();

高级搜索类:

private String selectedColumn = "",
        search = "",
        logic = "",
        isEqual = "";

private int widgetNum=-1;

Setter 和 getter 编写正确,advSearch 初始化正确。

      <h:form >
        <p:dialog width="800px" height="300px" widgetVar="advSearchWg" 
                  closable="true" draggable="true" minimizable="true" dynamic="true"
                  position="center" closeOnEscape="true" header="Advanced Search" onShow="L0.show()">

            <c:forEach items="#{browse.advSearch}" var="adv">                    
                <p:panel widgetVar="L#{adv.widgetNum}" visible="false" style="height: 50px;border:none;margin:0px 20px 0px 20px" closable="true">
                    <h:panelGrid columns="7">
                        <p:selectOneMenu value="#{adv.logic}" style="width: 100px;margin-left: 20px" >  
                            <f:selectItem itemLabel="AND" itemValue="AND" />
                            <f:selectItem itemLabel="OR" itemValue="OR"  />                                                                   
                        </p:selectOneMenu>  
                        <p:selectOneMenu value="#{adv.isEqual}" style="width: 100px;margin-left: 20px" >  
                            <f:selectItem itemLabel="EQUAL" itemValue="equal" />
                            <f:selectItem itemLabel="NOT EQUAL" itemValue="not equal"  />                                                                   
                        </p:selectOneMenu> 
                        <p:inputText value="#{adv.search}" required="true" autocomplete="true" style="width: 100px;margin-left: 20px"/>
                        <h:outputText value="in" style="margin-left: 20px" />
                        <p:selectOneMenu value="#{adv.selectedColumn}" style="width: 100px;margin-left: 20px" >  
                            <f:selectItems value="#{browse.advSearchCols}" />  
                        </p:selectOneMenu>
                        <c:if test="#{adv.nextWg() != (browse.advSearch.size() - 1)}">
                            <p:commandButton icon="ui-icon-plus" oncomplete="L#{adv.nextWg()}.show()" />                                
                        </c:if>
                        <c:if test="#{adv.widgetNum != 0}">
                            <p:commandButton icon="ui-icon-minus" oncomplete="L#{adv.widgetNum}.close()"/>
                        </c:if>
                    </h:panelGrid>                        
                </p:panel>                   
            </c:forEach>
            <p:commandButton process="@this" async="true" action="#{browse.advSearcher()}" value="Search" style="margin-left:60px" icon="ui-icon-search" />
        </p:dialog>
    </h:form>

输出:

为什么logicisEqualsearchselectedColumn 没有更新?为什么列表的元素没有更新?

我使用 Primefaces 3.5RC1。

【问题讨论】:

    标签: jsf-2 dialog primefaces arraylist foreach


    【解决方案1】:

    这里,

    <p:commandButton process="@this" ... />
    

    您没有处理表单中的所有输入组件。您只是在处理按钮组件本身。删除该属性。它已经默认为@form

    此外,我建议使用&lt;ui:repeat&gt;rendered 属性而不是&lt;c:forEach&gt;&lt;c:if&gt;

    【讨论】:

    • 如果我不使用 process="@this" ,则不会触发 commandButton 中的操作,也不会提交表单。因此,我做到了@this。我通过添加 h:form 解决了这个问题在 forEach 内部。然后我编写了提交所有表单的 javascript 代码。当我单击命令按钮时,我提交所有表单。我还能做什么?
    • 如前所述,使用&lt;ui:repeat&gt;rendered 属性而不是&lt;c:forEach&gt;&lt;c:if&gt;
    • 感谢您的回答。我会尝试:)。
    猜你喜欢
    • 2018-04-16
    • 2018-12-30
    • 2018-05-07
    • 1970-01-01
    • 2022-06-19
    • 2012-10-15
    • 2016-04-02
    • 1970-01-01
    • 2015-12-02
    相关资源
    最近更新 更多