如何使用 primefaces 自动完成与预选值的组合?
How use primefaces autocomplete into composite with preselected values?
我在 UIInput 组合中使用自动完成 primefaces 组件时遇到问题。我的目标是在自动完成字段中使用预选值初始化应用程序,并相应地显示标签。下面我展示一个测试代码
第testPage.xhtml
页
<f:view id="view" locale="#{webSession.currentLanguage.locale}">
<h:head>
<title>...</title>
</h:head>
<h:body>
<h:form>
<utils:element/>
<p:autoComplete
value="#{testPage.attr}"
completeMethod="#{testPage.completeMethod}"
var="item"
itemLabel="#{item}"
itemValue="#{item}" />
</h:form>
</h:body>
</f:view>
托管 Bean TestPage.xhtml
@ManagedBean(name = "testPage")
@ViewScoped
public class TestPage {
private String attr;
@PostConstruct
public void init(){
attr = "value 1";
}
public String getAttr() {
return attr;
}
public void setAttr(String attr) {
this.attr = attr;
}
public List<String> completeMethod(String query) {
return Arrays.asList(new String[]{"1111", "2222", "3333"});
}
}
这种方法直接在 testPage.xhtml 上使用自动完成功能效果很好。但是,我想将此自动完成包装在 element 组合中,如以下代码所示
element.xhtml 复合页
<ui:component xmlns="http://www.w3.org/1999/xhtml"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:cc="http://java.sun.com/jsf/composite">
<cc:interface componentType="elementComponent">
</cc:interface>
<cc:implementation>
<p:autoComplete
value="#{cc.attr}"
completeMethod="#{cc.completeMethod}"
var="item"
itemLabel="#{item}"
itemValue="#{item}" />
</cc:implementation>
</ui:component>
ElementComponent 复合背衬
@FacesComponent("elementComponent")
@ViewScoped
public class ElementComponent extends UIInput implements NamingContainer{
private String attr;
@Override
public String getFamily() {
return UINamingContainer.COMPONENT_FAMILY;
}
public List<String> completeMethod(String query) {
return Arrays.asList(new String[]{"value 1", "value 2", "value 3"});
}
@Override
public void encodeBegin(FacesContext context) throws IOException {
attr = "value 1";
}
public String getAttr() {
return attr;
}
public void setAttr(String attr) {
this.attr = attr;
}
}
但是当我在 testPage.xhtml 中包含元素复合时,自动完成不会显示预选值(与直接实现不同)。有什么办法可以解决这个问题吗? FacesComponent 的实现中可能缺少任何方法或属性?我倾向于认为这是 primefaces 的实现和 composite 的实现之间的一个错误,但我不确定。
问题出在方法 encodeBegin() 上。此实现需要组件 class 的编码,以及 parent (UIInput) 的编码。
不正确
@Override
public void encodeBegin(FacesContext context) throws IOException {
attr = "value 1";
}
正确
@Override
public void encodeBegin(FacesContext context) throws IOException {
attr = "value 1";
super.encodeBegin();
}
我在 UIInput 组合中使用自动完成 primefaces 组件时遇到问题。我的目标是在自动完成字段中使用预选值初始化应用程序,并相应地显示标签。下面我展示一个测试代码
第testPage.xhtml
页<f:view id="view" locale="#{webSession.currentLanguage.locale}">
<h:head>
<title>...</title>
</h:head>
<h:body>
<h:form>
<utils:element/>
<p:autoComplete
value="#{testPage.attr}"
completeMethod="#{testPage.completeMethod}"
var="item"
itemLabel="#{item}"
itemValue="#{item}" />
</h:form>
</h:body>
</f:view>
托管 Bean TestPage.xhtml
@ManagedBean(name = "testPage")
@ViewScoped
public class TestPage {
private String attr;
@PostConstruct
public void init(){
attr = "value 1";
}
public String getAttr() {
return attr;
}
public void setAttr(String attr) {
this.attr = attr;
}
public List<String> completeMethod(String query) {
return Arrays.asList(new String[]{"1111", "2222", "3333"});
}
}
这种方法直接在 testPage.xhtml 上使用自动完成功能效果很好。但是,我想将此自动完成包装在 element 组合中,如以下代码所示
element.xhtml 复合页
<ui:component xmlns="http://www.w3.org/1999/xhtml"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:cc="http://java.sun.com/jsf/composite">
<cc:interface componentType="elementComponent">
</cc:interface>
<cc:implementation>
<p:autoComplete
value="#{cc.attr}"
completeMethod="#{cc.completeMethod}"
var="item"
itemLabel="#{item}"
itemValue="#{item}" />
</cc:implementation>
</ui:component>
ElementComponent 复合背衬
@FacesComponent("elementComponent")
@ViewScoped
public class ElementComponent extends UIInput implements NamingContainer{
private String attr;
@Override
public String getFamily() {
return UINamingContainer.COMPONENT_FAMILY;
}
public List<String> completeMethod(String query) {
return Arrays.asList(new String[]{"value 1", "value 2", "value 3"});
}
@Override
public void encodeBegin(FacesContext context) throws IOException {
attr = "value 1";
}
public String getAttr() {
return attr;
}
public void setAttr(String attr) {
this.attr = attr;
}
}
但是当我在 testPage.xhtml 中包含元素复合时,自动完成不会显示预选值(与直接实现不同)。有什么办法可以解决这个问题吗? FacesComponent 的实现中可能缺少任何方法或属性?我倾向于认为这是 primefaces 的实现和 composite 的实现之间的一个错误,但我不确定。
问题出在方法 encodeBegin() 上。此实现需要组件 class 的编码,以及 parent (UIInput) 的编码。
不正确
@Override
public void encodeBegin(FacesContext context) throws IOException {
attr = "value 1";
}
正确
@Override
public void encodeBegin(FacesContext context) throws IOException {
attr = "value 1";
super.encodeBegin();
}