有没有办法让 JSF Backing bean 导致页面上的组件更新?我不希望使用具有更新属性的 ajax 组件来更新页面上的组件。我需要从 JSF 支持 bean 方法中触发更新。请注意,页面上的更新可能发生在此方法完成之后或完成之前。我正在使用 PrimeFaces,如果可以通过使用 PrimeFaces 获得解决方案。
5 回答
使用标准 JSF API,将客户端 ID 添加到PartialViewContext#getRenderIds()
.
FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add("foo:bar");
使用 PrimeFaces 特定 API,使用PrimeFaces.Ajax#update()
.
PrimeFaces.current().ajax().update("foo:bar");
或者,如果您还没有使用 PrimeFaces 6.2+,请使用RequestContext#update()
.
RequestContext.getCurrentInstance().update("foo:bar");
如果您碰巧使用 JSF 实用程序库OmniFaces,请使用Ajax#update()
.
Ajax.update("foo:bar");
无论采用哪种方式,请注意,这些客户端 ID 应该代表绝对客户端 ID,它们不以分隔符为前缀,NamingContainer
就像您从视图端所做的那样。
我还尝试从 jsf 支持 bean/类更新组件
操作完 UI 组件后,需要进行以下操作:
FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add(componentToBeRerendered.getClientId())
使用 clientId 而不是(服务器端)componentId 很重要!!
已从Primefaces 6.2RequestContext
中弃用。从此版本开始使用以下内容:
if (componentID != null && PrimeFaces.current().isAjaxRequest()) {
PrimeFaces.current().ajax().update(componentID);
}
并从后台执行javascript使用这种方式:
PrimeFaces.current().executeScript(jsCommand);
参考:
只有有足够的时间研究,一切皆有可能:)
我要做的就像让人们迭代到 ui:repeat 并在输入中显示名称和其他字段。但是其中一个字段是 singleSelect - A 并根据它的值更新另一个输入 - B。甚至 ui:repeat 也没有我输入的 id 并且它出现在 DOM 树中
<ui:repeat id="peopleRepeat"
value="#{myBean.people}"
var="person" varStatus="status">
比 html 中的 id 是这样的:
myForm:peopleRepeat:0:personType
myForm:peopleRepeat:1:personType
比在视图中我得到一种方法,例如:
<p:ajax event="change"
listener="#{myBean.onPersonTypeChange(person, status.index)}"/>
它的实现是在 bean 中,如:
String componentId = "myForm:peopleRepeat" + idx + "personType";
PrimeFaces.current().ajax().update(componentId);
因此,我通过这种方式更新了 bean 中的元素,没有任何问题。PF 6.2 版
祝你好运,编码愉快:)
为了从 backing bean 更新组件,我们可以实现如下
RequestContext.getCurrentInstance().update('updatePanelGroup');
<h:panelGroup id="updatePanelGroup">
.....
....
</h:panelGroup>
更新组件的基本面版本不同。