【问题标题】:Primefaces p:orderList java backing list does not updatePrimefaces p:orderList java后备列表不更新
【发布时间】:2014-02-19 11:20:42
【问题描述】:

我目前正在使用嵌入在 .我能够让列表与我的项目一起正确显示。但是,当我保存列表并将其提交回服务器时,由于某种原因,重新排列的项目没有反映在支持 bean 中。由于 Primefaces 展示能够看到这些变化,我做错了什么?

XHTML 片段

<h:form id="confirmDialogForm">
            <p:confirmDialog id="arrangeProjDialog" widgetVar="arrangeDlg" width="600"
                header="Meeting Order" 
                appendToBody="true" message="Drag and drop to rearrange meeting order">     

            <p:orderList id="arrangeProjDialogList" 
                value="#{adminMeetingListBean.orderProjList}"
                converter="#{adminMeetingListBean.rowConverter}"
                var="po"
                controlsLocation="left"
                styleClass="wideList"
                itemLabel="#{po.projectTitle}" 
                itemValue="#{po}"
                >
                <f:facet name="caption">Proposals</f:facet> 
            </p:orderList>

                <p:commandButton value="Save" ajax="true" process="arrangeProjDialogList @this" 
                    actionListener="#{adminMeetingListBean.updateProposalMeetingOrder}" onclick="arrangeDlg.hide();">
                </p:commandButton>
                <p:button value="Cancel" onclick="arrangeDlg.hide(); return false;" />
            </p:confirmDialog>  
        </h:form>

支持 Bean

public void updateProposalMeetingOrder() {

    if (selectedMeeting != null) {

        orderProjTitles.get(0);

        meetingService.updateMeetingProjSequence(orderProjList, selectedMeeting.getMeetingId());
    }

}

列表是 POJO“ProposalOrderRow”对象的列表。这有定义:

public class ProposalOrderRow implements Serializable {

    private static final long serialVersionUID = -5012155654584965160L;

    private int dispSeq;
    private int appId;
    private int assignmentId;
    private String refNo;
    private String projectTitle;

    public int getDispSeq() {
        return dispSeq;
    }

    public void setDispSeq(int dispSeq) {
        this.dispSeq = dispSeq;
    }

    public int getAppId() {
        return appId;
    }

    public void setAppId(int appId) {
        this.appId = appId;
    }

    public String getRefNo() {
        return refNo;
    }

    public void setRefNo(String refNo) {
        this.refNo = refNo;
    }

    public String getProjectTitle() {
        return projectTitle;
    }

    public void setProjectTitle(String projectTitle) {
        this.projectTitle = projectTitle;
    }

    public int getAssignmentId() {
        return assignmentId;
    }

    public void setAssignmentId(int assignmentId) {
        this.assignmentId = assignmentId;
    }
}

转换器:

@FacesConverter("proposalOrderRowConverter")
public class ProposalOrderRowConverter implements Converter {

    private List<ProposalOrderRow> orderRows;

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String newValue) {

        if (newValue.isEmpty()) {
            return null;
        }

        for (ProposalOrderRow item : orderRows) {

            String refNo = item.getRefNo();

            if (refNo.equals(newValue)) {
                return item;
            }

        }

        return null;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {

        if (value == null) {
            return "";
        } 

        ProposalOrderRow row = (ProposalOrderRow) value;

        String output = row.getRefNo();

        return output;
    }

    public List<ProposalOrderRow> getOrderRows() {
        return orderRows;
    }

    public void setOrderRows(List<ProposalOrderRow> orderRows) {
        this.orderRows = orderRows;
    }

}

【问题讨论】:

  • orderList 的转换器在哪里??
  • 谢谢。我已按要求发布了转换器。问题是当转换器的 getAsString 被调用时,它的 getAsObject 方法从未被调用。
  • 您还需要在 p:orderList 中添加标签转换器=""。
  • 已编辑,但代码仅调用 getAsString()。 getAsObject() 永远不会被调用,我的支持列表永远不会被更新。
  • @futureelite7 这意味着在提交期间应该发生的转换没有发生。我的第一个猜测是adminMeetingListBean 的范围以及您如何实例化proposalOrderRowConverter。为什么不将转换器定义为独立转换器而不是使其成为托管 bean 的成员?您似乎没有正确管理转换器的生命周期,使其在请求的转换阶段不可用

标签: jsf primefaces facelets


【解决方案1】:

此问题是由确认对话框中的 appendToBody="true" 引起的。将其设置为 false 即可解决问题。

在此处查看链接:link

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 2021-02-24
    相关资源
    最近更新 更多