Sil*_*ish 4 java jsf primefaces omnifaces
我的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;
}
Run Code Online (Sandbox Code Playgroud)
我的转换器是
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;
}
}
Run Code Online (Sandbox Code Playgroud)
最后我的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>
Run Code Online (Sandbox Code Playgroud)
pickList正确显示,源中填充了数据库中的值,但是,单击该按钮后,即使在界面上传输项目后,对话框也会显示原始源列表值和空目标列表.我错过了什么?
我发现你的代码存在一些问题.在getter中,您正在从数据库重建DualList,重置到目前为止您所做的任何更改.
试着让你得到这样的东西:
public DualListModel<Course> getCourseModel() {
return this.courseModel;
}
Run Code Online (Sandbox Code Playgroud)
在注释@PostConstruct而不是构造函数+ getter中的方法中,从数据库构造和加载列表.
public CourseBean() {}
@PostConstruct
public void init() {
List<Course> target = new ArrayList<Course>();
courseModel.setSource(getCourseList());
courseModel = new DualListModel<Course>(source, target);
}
Run Code Online (Sandbox Code Playgroud)
还要注释你的bean @ViewScoped,所以你不要在每个请求上构造一个带有空目标列表的新bean
@ManagedBean(name="courseView")
@ViewScoped
public class CourseBean {
}
Run Code Online (Sandbox Code Playgroud)
最后你还需要一个setter:
public void setCourseModel(DualListModel<Course> courseModel) {
this.courseModel = courseModel;
}
Run Code Online (Sandbox Code Playgroud)
我还没有真正研究过这个转换器,当我上次拿到一个选项列表时,我将转换器包含在primefaces展示中(从未尝试过omnifaces).以下是该来源的链接:http://code.google.com/p/ind/source/browse/indicadorCensoJSF/src/ve/gob/ine/censo/beans/convert/PrimeFacesPickListConverter.java?specl = dsn154&r = 154
| 归档时间: |
|
| 查看次数: |
15789 次 |
| 最近记录: |