Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf p:commandButton在使用筛选器时在p:dataTable中不工作_Jsf_Primefaces - Fatal编程技术网

Jsf p:commandButton在使用筛选器时在p:dataTable中不工作

Jsf p:commandButton在使用筛选器时在p:dataTable中不工作,jsf,primefaces,Jsf,Primefaces,我正在使用JSF、PrimeFaces5.2和GlassFish 4.1 我已经建立了一个简单的项目来测试和复制我的大问题,并且发现它在测试项目中是可重复的 我有一个简单的页面和一个简单的对象列表。我正在使用,并使用全局搜索功能和分页 表格代码 <ui:define name="content"> <h:form id="carsForm" > <p:dataTable id="singleDT" var="c" value="#{testF

我正在使用JSF、PrimeFaces5.2和GlassFish 4.1

我已经建立了一个简单的项目来测试和复制我的大问题,并且发现它在测试项目中是可重复的

我有一个简单的页面和一个简单的对象列表。我正在使用
,并使用全局搜索功能和分页

表格代码

<ui:define name="content">
    <h:form id="carsForm" >
        <p:dataTable id="singleDT" var="c" value="#{testFlow.cars}" widgetVar="carsTable" rows="10" paginator="true"
                     paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                     rowsPerPageTemplate="5,10,15" emptyMessage="No cars found with the given criteria" reflow="true"
                     filteredValue="#{testFlow.filteredCars}">

            <f:facet name="header">
                <p:outputPanel class="fright">
                    <h:outputText value="Search all fields: " />
                    <p:inputText id="globalFilter" onkeyup="PF('carsTable').filter()" style="width:200px" placeholder="Enter keyword" />
                </p:outputPanel>
                <p:outputPanel class="Fleft">
                    <p:commandButton value="New Car" action="addCar" />
                </p:outputPanel>
                <div class="EmptyBox5"></div>
            </f:facet>

            <p:column filterBy="#{c.id}" headerText="ID" sortBy="#{c.id}" >
                <h:outputText value="#{c.id}"/>
            </p:column>

            <p:column filterBy="#{c.m}" headerText="Model Year" sortBy="#{c.modelYear}" >
                <h:outputText value="#{c.modelYear}"/>
            </p:column>

            <p:column filterBy="#{c.make}" headerText="Make" sortBy="#{c.make}" >
                <h:outputText value="#{c.make}"/>
            </p:column>

            <p:column filterBy="#{c.model}" headerText="Model" sortBy="#{c.model}" >
                <h:outputText value="#{c.model}"/>
            </p:column>

            <p:column filterBy="#{c.color}" headerText="Color" sortBy="#{c.color}" >
                <h:outputText value="#{c.color}"/>
            </p:column>

            <p:column style="width: 200px; text-align: center">
                <p:commandButton actionListener="#{testFlow.removeCar(c)}" value="Delete" update="singleDT messages" ajax="true" >
                    <p:confirm header="Confirmation" message="Are you sure?" icon="ui-icon-alert" />
                </p:commandButton>
            </p:column>
        </p:dataTable>

        <div class="EmptyBox5"></div>
        <p:panel>
            <p:commandButton action="returnFromTestFlow" value="Exit the Flow" />
        </p:panel>
    </h:form>

    <p:messages id="messages" autoUpdate="true" closable="true" />

    <p:confirmDialog global="true" showEffect="fade" hideEffect="explode">
        <p:commandButton value="Yes" type="button" styleClass="ui-confirmdialog-yes" icon="ui-icon-check" />
        <p:commandButton value="No" type="button" styleClass="ui-confirmdialog-no" icon="ui-icon-close" />
    </p:confirmDialog>
</ui:define>
当我删除所有筛选和排序时,在我单击“是”并删除该行后将调用该方法。然而,当筛选和排序就绪时,整个表只是重新显示为空,但从未调用任何方法。不会出现错误,并且在使用调试器时,它不会在所讨论的方法中遇到断点


任何帮助或指导都将不胜感激。

当您使用筛选时,primefaces会创建一个列表并在结果中显示,当您从主列表中删除一个项目时,它与显示列表无关,这可能会导致一些问题,比如发生在您身上的事情。

我认为问题在于首先使用您提供的列表呈现datatable,但当您按下按钮时,它会在过滤列表中搜索,并且由于该列表最初为空,因此无法找到该按钮。另一方面,请注意,如果输入搜索条件并再次将其删除,则按钮将起作用。这是因为已填充筛选列表,现在可以找到按钮。要解决此问题,需要使用所有预渲染值填充筛选列表。就你而言:

在您的支持bean中:

public void init()
{
    if(!FacesContext.getCurrentInstance().isPostback())
    {
        filteredCars = cars;
    }
}
<f:event type="preRenderView" listener="#{testFlow.init}"/>;
在您的xhtml文件中:

public void init()
{
    if(!FacesContext.getCurrentInstance().isPostback())
    {
        filteredCars = cars;
    }
}
<f:event type="preRenderView" listener="#{testFlow.init}"/>;

另一种方法是在init()函数上使用
@PostConstruct
注释,而不是
有同样的问题,@djst解决方案对我不起作用,但我最终通过使用Omnifaces表单(
o:form
)而不是标准的
h:form
解决了这个问题。虽然不知道为什么,但可能值得一试。

但是应该做些什么来修复它呢?现在,这更多的是一个评论,而不是一个回答。我应该补充一点,这发生在未过滤列表和过滤列表上。另外,当使用action=或actionListener=时,结果是相同的。谢谢!我在这个问题上被困了3个小时。