如何使用 primefaces update 或 jsf render 刷新自定义组件?
How to refresh a custom component with primefaces update or jsf render?
我尝试用 jsf2.1 定义自定义组件。单击按钮后必须更新组件。该组件有一个 rendered 属性,默认为 false,即在单击按钮时更新。这是我的代码。
<cu:ActionBar id="actionBar" rendered="#{bean.booleanCondition}">
<!-- some code inside !-->
</cu:ActionBar>
触发更新的代码。
<p:commandButton id="myButton" actionListener="#{bean.foo} update=":actionBar"/>
使用此代码,bean.booleanCondition 设置为 true,但永远不会显示 actionBar 组件。如果我将组件包装在 a 中,它就可以工作。
这是我的 ActionBar 组件 class :
@FacesComponent(value = "ACTION_BAR")
public class ActionBarComponent extends UIPanel {
@Override
public void encodeBegin(FacesContext ctx) throws IOException {
if (ctx == null) {
throw new NullPointerException();
}
ResponseWriter writer = ctx.getResponseWriter();
writer.startElement("div", this);
if (this.getAttributes().get("id") != null) {
writer.writeAttribute("id", this.getAttributes().get("id"), "id");
}
String styleClass = this.getAttributes().get("styleClass") != null ? "" : " " + this.getAttributes().get("styleClass");
writer.writeAttribute("class", "actionBar" + styleClass, null);
writer.startElement("form", this);
writer.writeAttribute("enctype", "application/x-www-form-urlencoded", null);
writer.writeAttribute("method", "post", null);
writer.writeAttribute("name", "actionBarForm", null);
if (this.getAttributes().get("id") != null) {
writer.writeAttribute("id", this.getAttributes().get("id") + ":" + this.getAttributes().get("id") + "Form", "id");
}
writer.writeAttribute("action", ctx.getExternalContext().getRequestContextPath() + ctx.getExternalContext().getRequestServletPath(), null);
writer.startElement("div", this);
writer.writeAttribute("class", "actionBarGroup", "class");
writer.startElement("span", this);
writer.append("Actions :");
writer.endElement("span");
}
@Override
public void encodeEnd(FacesContext ctx) throws IOException {
if (ctx == null) {
throw new NullPointerException();
}
ResponseWriter writer = ctx.getResponseWriter();
writer.endElement("div");
writer.endElement("form");
writer.endElement("div");
}
}
我怎样才能让它发挥作用?
您不能更新具有 rendered
属性的组件。这里有解释和解决方法: update
attribute does not update component 一般情况下,把rendered
组件包裹在<h:panelGroup>
里面更新。
我尝试用 jsf2.1 定义自定义组件。单击按钮后必须更新组件。该组件有一个 rendered 属性,默认为 false,即在单击按钮时更新。这是我的代码。
<cu:ActionBar id="actionBar" rendered="#{bean.booleanCondition}">
<!-- some code inside !-->
</cu:ActionBar>
触发更新的代码。
<p:commandButton id="myButton" actionListener="#{bean.foo} update=":actionBar"/>
使用此代码,bean.booleanCondition 设置为 true,但永远不会显示 actionBar 组件。如果我将组件包装在 a 中,它就可以工作。
这是我的 ActionBar 组件 class :
@FacesComponent(value = "ACTION_BAR")
public class ActionBarComponent extends UIPanel {
@Override
public void encodeBegin(FacesContext ctx) throws IOException {
if (ctx == null) {
throw new NullPointerException();
}
ResponseWriter writer = ctx.getResponseWriter();
writer.startElement("div", this);
if (this.getAttributes().get("id") != null) {
writer.writeAttribute("id", this.getAttributes().get("id"), "id");
}
String styleClass = this.getAttributes().get("styleClass") != null ? "" : " " + this.getAttributes().get("styleClass");
writer.writeAttribute("class", "actionBar" + styleClass, null);
writer.startElement("form", this);
writer.writeAttribute("enctype", "application/x-www-form-urlencoded", null);
writer.writeAttribute("method", "post", null);
writer.writeAttribute("name", "actionBarForm", null);
if (this.getAttributes().get("id") != null) {
writer.writeAttribute("id", this.getAttributes().get("id") + ":" + this.getAttributes().get("id") + "Form", "id");
}
writer.writeAttribute("action", ctx.getExternalContext().getRequestContextPath() + ctx.getExternalContext().getRequestServletPath(), null);
writer.startElement("div", this);
writer.writeAttribute("class", "actionBarGroup", "class");
writer.startElement("span", this);
writer.append("Actions :");
writer.endElement("span");
}
@Override
public void encodeEnd(FacesContext ctx) throws IOException {
if (ctx == null) {
throw new NullPointerException();
}
ResponseWriter writer = ctx.getResponseWriter();
writer.endElement("div");
writer.endElement("form");
writer.endElement("div");
}
}
我怎样才能让它发挥作用?
您不能更新具有 rendered
属性的组件。这里有解释和解决方法: update
attribute does not update component 一般情况下,把rendered
组件包裹在<h:panelGroup>
里面更新。