簡體   English   中英

Primefaces選取列表目標和源值不變

[英]Primefaces picklist target and source values do not change

我的primefaces pickList源和目標值沒有改變,我已經按照primefaces展示中的示例進行了介紹 ,還查看了此處的幾篇文章,但仍然無法解決問題。 我正在使用數據庫中的列表來填充源,如下所示:

private DualListModel<Course> courseModel;
public CourseBean() {
    List<Course> target = new ArrayList<Course>();
    List<Course> source = new ArrayList<Course>();
    courseModel = new DualListModel<Course>(source, target);
}
...
//this DualListModel getter also populates the source with values from db
public DualListModel<Course> getCourseModel() {
    courseModel.setSource(getCourseList());
    return courseModel;
}

我的轉換器是

import org.omnifaces.converter.SelectItemsConverter;

@FacesConverter("courseConverter")
public class CourseConverter extends SelectItemsConverter {
@Override
public String getAsString(FacesContext context, UIComponent component,
        Object value) {
    Integer id = (value instanceof Course) ? ((Course) value).getId()
            : null;
    return (id != null) ? String.valueOf(id) : null;
}
@Override
public Object getAsObject(FacesContext arg0, UIComponent arg1, String value) {
    Course course = new Course();
    course.setId(Integer.parseInt(value));
    return course;
}
}

最后我的xhtml頁面是:

<h:form>
    <p:pickList id="coursesOffered"
        value="#{courseView.courseModel}" var="course"
        itemValue="#{course}" itemLabel="#{course.courseTitle}"
        converter="courseConverter" showSourceFilter="true"
        showTargetFilter="true" filterMatchMode="contains">

        <f:facet name="targetCaption">Selected</f:facet>
        <f:facet name="sourceCaption">All Courses</f:facet>

        <p:ajax event="transfer" listener="#{courseView.onTransfer}" />

        <p:column style="width:10%">  
        #{course.courseCode}:
    </p:column>
        <p:column style="width:90%">  
       #{course.courseTitle}  
    </p:column>

    </p:pickList>

    <p:commandButton id="pojoSubmit" value="Submit"
        update="displayPlayers" oncomplete="playerDialog.show()"
        style="margin-top:5px" />

    <p:dialog showEffect="fade" hideEffect="fade" widgetVar="playerDialog">
        <h:panelGrid id="displayPlayers" columns="2">

            <h:outputText value="Source: " style="font-weight:bold" />
            <ui:repeat value="#{courseView.courseModel.source}"
                var="course">
                <h:outputText value="#{course.courseTitle}"
                    style="margin-right:5px" />
            </ui:repeat>

            <h:outputText value="Target: " style="font-weight:bold" />
            <ui:repeat value="#{courseView.courseModel.target}"
                var="course">
                <h:outputText value="#{course.courseTitle}"
                    style="margin-right:5px" />
            </ui:repeat>

        </h:panelGrid>
    </p:dialog>
</h:form>

pickList正確顯示,並且源中填充了數據庫中的值,但是,單擊該按鈕后,即使在界面上傳輸項目之后,對話框也僅顯示原始源列表值和空目標列表。 我想念什么?

我發現您的代碼存在一些問題。 在getter中,您正在從數據庫中重構DualList,重置到目前為止所做的所有更改。

嘗試使您得到這樣的東西:

public DualListModel<Course> getCourseModel() {
    return this.courseModel;
}

使用注解@PostConstruct的方法(而不是構造函數+ getter)從數據庫構造和加載列表。

public CourseBean() {}

@PostConstruct
public void init() {
    List<Course> target = new ArrayList<Course>();
    courseModel.setSource(getCourseList());
    courseModel = new DualListModel<Course>(source, target);
}

還要對您的bean @ViewScoped進行注釋,這樣您就不會在每個請求中都使用空的目標列表構造一個新bean。

@ManagedBean(name="courseView")
@ViewScoped
public class CourseBean {

}

最后,您還需要一個setter:

public void setCourseModel(DualListModel<Course> courseModel) {
    this.courseModel = courseModel;
}

我還沒有真正研究過轉換器,上次我做一個選擇列表時,我選擇了包含在primefaces展示櫃中的轉換器(從來沒有嘗試過全能者)。 這里是到源的鏈接: http : //code.google.com/p/ind/source/browse/indicadorCensoJSF/src/ve/gob/ine/censo/beans/convert/PrimeFacesPickListConverter.java?spec=svn154&r= 154

作為已接受答案的補充, Omnifaces列表轉換器存在問題。 一切正常,除了已選擇的項目不會被更新和“丟失”,而是在視圖中存在,但處理的唯一項目是在視圖中進行選擇,而不是已在其中設置為目標的項目Bean,因此,目標列表只包含在視圖中選擇的項目,而不是先前設置的項目,而不是具有包含選擇的項目的目標列表以及在dualList構造函數中設置的項目。

作為解決方案,我還為primefaces組件實現了自定義選擇列表轉換器。 現在,一切都像魅力。

我沒有具體回答實際問題,因為它已經有了一個可以接受的答案(而且我沒有評論的要點)。 我只是在補充,因為有些人可能在使用素數2.3和全能3.1時遇到問題。 我確實搜索了很多有關所面臨問題的信息,但至少沒有發現正在發生的情況的提示。

如果有人有疑問,此站點: 選擇列表示例包含有關如何制作轉換器的教程。 ACV的答案對轉換器也有效,盡管它是由問這個問題的Silverfish實施的。

要使用對象,您需要一個轉換器。 這是如何實現的最佳答案: https : //stackoverflow.com/a/6625392/912829

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM