有没有办法让 JSF 支持Bean导致页面上组件的更新?我不想使用具有更新属性的 ajax 组件来更新页面上的组件。我需要从 JSF 支持 bean 方法中触发更新。注意:页面上的更新可能发生在此方法完成后或完成之前。我正在使用PrimeFaces,如果使用PrimeFaces可以获得解决方案的话。
使用标准 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,这些客户端 ID 不像从视图端那样以NamingContainer
分隔符为前缀。
我还尝试从 jsf 支持bean/类更新组件
操作 UI 组件后,您需要执行以下操作:
FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add(componentToBeRerendered.getClientId())
使用 clientId 而不是(服务器端)组件 ID 很重要!!
RequestContext
已从Primefaces 6.2中弃用。在此版本中,请使用以下命令:
if (componentID != null && PrimeFaces.current().isAjaxRequest()) {
PrimeFaces.current().ajax().update(componentID);
}
要从backbean执行javascript,请使用以下方式:
PrimeFaces.current().executeScript(jsCommand);
参考:
- https://github.com/primefaces/primefaces/wiki/Migration-Guide
- https://forum.primefaces.org/viewtopic.php?t=53129
只有有足够的时间研究:)一切才有可能
我必须做的就像让我迭代到 ui:repeat 并在输入中显示名称和其他字段的人一样。但是其中一个字段是单选 - A 并根据它的值更新另一个输入 - B。甚至 ui:重复没有我放的 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)}"/>
它的实现是在豆子中,如下所示:
String componentId = "myForm:peopleRepeat" + idx + "personType";
PrimeFaces.current().ajax().update(componentId);
因此,通过这种方式,我从 bean 更新了元素,没有任何问题。PF 版本 6.2
祝你好运,编码:)快乐
为了从支持 bean 更新组件,我们可以实现如下 RequestContext.getCurrentInstance().update('updatePanelGroup');
<h:panelGroup id="updatePanelGroup">
.....
....
</h:panelGroup>
更新组件与原始面版本不同。