4

私の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 は、データベースからの値が入力されたソースで正しく表示されますが、ボタンをクリックすると、インターフェイスでアイテムを転送した後でも、ダイアログには元のソース リストの値と空のターゲット リストが表示されます。私は何が欠けていますか?

4

3 に答える 3

5

あなたのコードにはいくつかの問題があります。getter では、これまでに行った変更をリセットして、データベースから DualList を再構築しています。

次のようなゲッターを作成してみてください。

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

コンストラクター + ゲッターではなく、@PostConstruct アノテーションが付けられたメソッドで、データベースからリストを構築してロードします。

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 {

}

最後に、セッターも必要です。

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

前回ピックリストを作成したときに、コンバーターを実際に調べたことはありません。ソースへのリンクは次のとおりです。 154

于 2012-12-01T07:34:35.590 に答える
1

受け入れられた回答を補完するものとして、Omnifacesリスト コンバーターに問題がありました。既に選択されたアイテムが更新されておらず「失われた」ことを除いて、すべてが機能しました。つまり、それらはビューにありましたが、処理されたアイテムのみがビューで選択され、ターゲットとして既に設定されていたアイテムではありませんでした。そのため、選択されたアイテムと dualList コンストラクターで設定されたアイテムを含むターゲット リストを持つ代わりに、ターゲット リストには、以前に設定されたアイテムではなく、ビューで選択されたアイテムのみが含まれていました。

解決策として、primefaces コンポーネント用のカスタム ピックリスト コンバーターも実装しました。今ではすべてが魔法のように機能します。

すでに受け入れられている回答があるため、実際の質問には具体的に回答していません(コメントするポイントがありません)。一部の人々は、primefaces 2.3 と omnifaces 3.1 の使用に問題がある可能性があるため、補足します。私は直面している問題について多くのことを検索しましたが、少なくとも何が起こっているのかのヒントは見つかりませんでした.

このサイト: picklist exampleには、疑問がある場合にコンバーターを作成する方法に関するチュートリアルがあります。ACV の回答はコンバーターにも有効ですが、質問をした Silverfish によって既に実装されています。

于 2018-07-27T18:46:21.180 に答える
0

オブジェクトを操作するには、コンバーターが必要です。これは、それを実装する最良の答えです: https://stackoverflow.com/a/6625392/912829

于 2016-09-17T17:02:30.357 に答える