如何从Primefaces的子表中调用方法?

时间:2012-10-21 01:01:03

标签: java jsf primefaces

我正在使用primefaces不久,我发现我不能使用<p:commandButton />,因为它无法到达方法,方法没问题,我尝试了表格(和子表格) )并且它在那里工作得很好(一切都在一个表格内),问题是我需要用户能够选择所有的子表,所以,我想可能有一个可能的按钮,但看起来像subtable doesn'允许这样,我可以做任何其他方式吗?或者我可能必须使用另一种方式从子表中调用我的方法,有人知道吗?

由于

我的一些代码

<h:form>
    <p:messages id="messages" showDetail="true" autoUpdate="true" closable="true" />  
    <p:dataTable id="case" var="ticket" value="#{CaseBean.selectedCase.tickets}">
        <p:columnGroup>
            <p:row>
                <p:column> Action:</p:column>
                <p:column>
                    <!-- This doesn't work, removed. -->
                    <p:commandButton value="Aprove" action="#{CaseBean.acept()}">
                    </p:commandButton>
                </p:column>
            </p:row>
        </p:columnGroup>

        <p:subTable var="detail" value="#{ticket.detail}">
            <f:facet name="header">
                Resume:
            </f:facet>
            <!-- some data... -->
            <p:column>
                <!-- doesn't work either -->
                <p:commandButton value="Aprove" action="#{CaseBean.aceptTicket()}">
                </p:commandButton>
            </p:column>
<!-- show my data -->

该表工作正常,它显示了所有数据,日志文件没有显示任何错误,因此,当我尝试从表中编写我的commandButton时它工作得很好,如果我不能在子表中写入它好的,但是,我怎么能在表中写出来?它也没有出现在那里。

4 个答案:

答案 0 :(得分:1)

你欢迎:) 但是,如果我是你,我不会使用子表,我会想到另一个解决方案..可能我会这样做,生病使用两个不同的数据表,第一个包含父列表,第二个包含子列表元素,以及每个选择都会触发第二个表的更新...我在我的IDE上尝试过它并且工作得很好

<h:form id="form">
<p:dataTable var="cas" value="#{beanCase.myListOfCase}"
    selection="#{beanCase.selectedCase}" rowKey="#{cas.idCase}"
    selectionMode="single">
    <p:ajax event="rowSelect" update=":form:TicketTable" />
    <p:column headerText="Id Case">
        <h:outputText value="#{cas.idCase}" />
    </p:column>
    <p:column headerText="Case Name ">
        <h:outputText value="#{cas.caseName}" />
    </p:column>
    <p:column headerText="Case Detail">
        <h:outputText value="#{cas.caseDetail}" />
    </p:column>
    <p:column headerText="Action">
        <p:commandButton value="Accept Case" update=":form:TicketTable"></p:commandButton>
    </p:column>
</p:dataTable>
<p:dataTable id="TicketTable" var="ticket"
    value="#{beanCase.selectedCase.tickets}">
    <p:column headerText="Ticket Number">
        <h:outputText value="#{ticket.idTicket}" />
    </p:column>
    <p:column headerText="Ticket Details">
        <h:outputText value="#{ticket.labelTicket}" />
    </p:column>
    <p:column headerText="show">
        <h:outputText value="#{ticket.show}" />
    </p:column>
    <p:column headerText="this show is brought to you by">
        <h:outputText value="#{ticket.sponsor}" />
    </p:column>
    <p:column headerText="Make a Reservation">
        <p:commandButton value="Buy" action="#{beanCase.buyTicket()}">
            <f:setPropertyActionListener value="#{ticket}"
                target="#{beanCase.selectedTicket}" />
        </p:commandButton>
    </p:column>
</p:dataTable>

之前,您必须为Case和ticket

创建数据模型类
public class CaseDataModel extends ListDataModel<Case> implements
    SelectableDataModel<Case> {
CaseDAO caseDAO = new CaseDAO();

public CaseDataModel() {
}

public CaseDataModel(List<Case> cases) {
    super(cases);
}

@Override
public Case getRowData(String arg0) {
    List<Case> listOfMyObjet = (List<Case>) caseDAO.findAll();
    for (Case obj : listOfMyObjet) {
        if (String.valueOf(obj.getIdCase()).equals(arg0))
            ;
        return obj;
    }
    return null;
}

@Override
public String getRowKey(Case arg0) {
    return String.valueOf(arg0.getIdCase());
}

}

答案 1 :(得分:0)

第一个columnGroup未呈现,因为在第一行中,列数为2,一个用于“action”,另一个用于commandButton,而在子表中,您只使用了两行一个用于“Resume”而其他只包含另一个commandButton的一列。 每列的列数应相同,因此您必须使用 colspan rowspan 来确保这一点。 至于使用 DataTable 的其余部分将完成这项工作,我不明白你想做什么,但我都假设你想从dataTable中显示的对象列表中选择myObject。因此,为了实现这一点, UidataTable 必须将对象返回给支持的Bean。

public class myObjectDataModel extends ListDataModel<myObject> implements SelectableDataModel<myObject> {    

    public myObjectDataModel() {  
    }  

    public myObjectDataModel(List<myObject> data) {  
        super(data);  
    }  

    @Override  
    public myObject getRowData(String rowKey) {         
       List<myObject> listOfMyObjet = (List<myObject>) yourDao.getListOfmyOjects();//get your list

        for(myObject obj : listOfMyObjet) {  
            if(obj.getIdObject().equals(rowKey))  
                return obj;  
        }  

        return null;  
    }  

    @Override  
    public Object getRowKey(myObject obj) {  
        return obj.getIdObject();  
    }
}

支持的bean:

public class tableBean {
    private List<myObject> _Objects;
    private myObjectDataModel myListOfObjects;
    private myObject selectedObject;
    //getters and setters
    public tableBean(){
        myObjectDataModel = new myObjectDataModel(_Objects);
    }
    //...
}

XHTML:

<p:dataTable id="table" var="case"
    value="#{tableBean.myObjectDataModel}"
    selection="#{tableBean.selectedObject}" selectionMode="single"
    rowKey="#{case.IdObject}">
    <p:column>

        <p:commandButton value="
    Aprove" action="#{tableBean.someMethod()}">
        </p:commandButton>
    </p:column>

</p:dataTable>

并确保使用Ajax - commandButton更新属性或<p:ajax> - 来刷新UI。

答案 2 :(得分:0)

尝试从JSF页面中删除p:columnGroup。你不需要它(这可能是你的问题的原因)。可以这样想:存在列的行和行存在的表。 ; - )

答案 3 :(得分:0)

#{CaseBean}必须位于视图范围内才能使其生效,或者如果要保持请求作用域,#{CaseBean.selectedCase.tickets}必须在(post)构造函数中准备在某些请求参数上,使其完全与显示表格时相同。

提交表单时,JSF将重复表格,以便找到负责该操作的命令组件。但是,如果bean是请求作用域,并且#{CaseBean.selectedCase}#{CaseBean.selectedCase.tickets}后面的值与显示表时相同,则JSF将无法识别调用该动作的按钮。

另见: