gpt4 book ai didi

java - Primefaces 选择列表目标和源值不会改变

转载 作者:搜寻专家 更新时间:2023-11-01 02:12:59 24 4
gpt4 key购买 nike

我的 primefaces pickList 源和目标值没有改变,我遵循了 primefaces showcase 中的示例并且还看了这里的几个帖子,但仍然无法解决问题。我正在使用数据库中的列表来填充源,如下所示:

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 展示柜中包含的转换器(从未尝试过 omnifaces 的)。这是来源的链接:http://code.google.com/p/ind/source/browse/indicadorCensoJSF/src/ve/gob/ine/censo/beans/convert/PrimeFacesPickListConverter.java?spec=svn154&r=154

关于java - Primefaces 选择列表目标和源值不会改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13657042/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com