动态实例化PF 3.4.2 AutoComplete组件时遇到问题。 组件初始呈现正常,其值在部分处理时刷新 但建议永远不会显示。
我以下列方式实例化此控件:
AutoComplete ac = (AutoComplete) context.getApplication().createComponent(AutoComplete.COMPONENT_TYPE);
final String varName = "p";
ValueExpression ve = JSFUtils.createValueExpression("#{minContext.selected.sen}"), Sen.Type);
ac.setValueExpression("value", ve);
ac.setForceSelection(true);
ac.setVar(varName);
ValueExpression itemLabel = JSFUtils.createValueExpression("#{sc:senLibelle(p)}"), String.class);
ac.setValueExpression("itemLabel", itemLabel);
ValueExpression itemValue = JSFUtils.createValueExpression("#{" + varName + "}");
ac.setValueExpression("itemValue", itemValue);
MethodExpression completeMethod = JSFUtils.createMethodExpression("#{senUtils.completeAllSens}", List.class,new Class[]{String.class});
ac.setCompleteMethod(completeMethod);
然后使用
将其添加到父控件 getChildrens().add(ac);
父组件是PF PanelGrid的派生。我成功地使用这种方法生成各种版面板,它就像一个魅力。但我无法弄清楚为什么它与autoComplete没有关系。
父控件如下所示:
@FacesComponent(SenatDataTableEntryDetail.SENAT_COMPONENT_TYPE)
public class SenatDataTableEntryDetail extends PanelGrid {
/** Leaving renderer unchanged, so that PF renderer for PanelGrid is used.
*/
public static final String SENAT_COMPONENT_FAMILY = "fr.senat.faces.components";
public static final String SENAT_COMPONENT_TYPE = SENAT_COMPONENT_FAMILY + ".SenatDataTableEntryDetail";
private enum PropertyKeys { mapper, bean; }
@Override
public void encodeBegin(FacesContext context) throws IOException {
super.encodeBegin(context);
addDynamicChildren(context);
}
@Override
public boolean getRendersChildren()
{
return true;
}
...
private Boolean isInitialized() {
return (Boolean)getStateHelper().eval(SENAT_INITIALIZED,false);
}
private void setInitialized(Boolean param) {
getStateHelper().put(SENAT_INITIALIZED, param);
}
private void addDynamicChildren(FacesContext context) throws IOException {
if(isInitialized()) {
return;
}
setInitialized(true);
/* components are instiated and added as children only once */
}
}
它只是将子项添加到面板网格中。
自定义组件声明的其他方面(在taglib等中)都可以。
问题似乎不在EL表达式,completeMethod定义等中。如果我在我的测试xhtml页面中包含p:autoComplete与实际参数相同的实例,它只是按预期工作:
<p:autoComplete value="#{minContext.selected.sen}" forceSelection="true"
var="p" itemLabel="#{sc:senLibelle(p)}" itemValue="#{p}"
completeMethod="#{senUtils.completeAllSens}"/>
我注意到PF AutoComplete组件有点特殊,因为它呈现的方式不同 检测到查询时请参阅http://primefaces.googlecode.com/files/primefaces-3.4.2.zip中的AutoCompleteRenderer源代码。
在“动态实例化”的情况下,不调用此组件的解码方法。我没有找到为什么那些最后的日子,但没有成功。
我期待着您对如何检查以纠正这个恼人的“错误”的建议。
答案 0 :(得分:2)
所以,问题在于id生成(参见两条评论)。
组件实例化的开始变为:
AutoComplete ac = (AutoComplete) context.getApplication().createComponent(AutoComplete.COMPONENT_TYPE);
ac.setParent(this);
ac.setId(...some application specific unique id generation...);
final String varName = "p";
这样,在客户端ID生成时,正确考虑了命名容器。