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>

选择列表正确显示,源中填充了数据库中的值,但是,单击按钮后,即使在界面上传输项目后,对话框也仅显示原始源列表值和空目标列表。我错过了什么?

4

3 回答 3

5

我发现您的代码存在一些问题。在 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 展示中(从未尝试过omnifaces)。这是源链接:http ://code.google.com/p/ind/source/browse/indicadorCensoJSF/src/ve/gob/ine/censo/beans/convert/PrimeFacesPickListConverter.java?spec=svn154&r= 154

于 2012-12-01T07:34:35.590 回答
1

作为已接受答案的补充,我遇到了Omnifaces列表转换器的问题。一切正常,除了已经选择的项目没有被更新和“丢失”,它们在视图中,但唯一处理的项目是视图中的选择,而不是已经设置为目标的项目bean,因此,目标列表中没有选择的项目加上在 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 回答