108

有没有办法让 JSF Backing bean 导致页面上的组件更新?我不希望使用具有更新属性的 ajax 组件来更新页面上的组件。我需要从 JSF 支持 bean 方法中触发更新。请注意,页面上的更新可能发生在此方法完成之后或完成之前。我正在使用 PrimeFaces,如果可以通过使用 PrimeFaces 获得解决方案。

4

5 回答 5

203

使用标准 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就像您从视图端所做的那样。

于 2012-07-06T17:51:42.740 回答
10

我还尝试从 jsf 支持 bean/类更新组件

操作完 UI 组件后,需要进行以下操作:

FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add(componentToBeRerendered.getClientId())

使用 clientId 而不是(服务器端)componentId 很重要!!

于 2015-07-02T10:48:39.077 回答
8

已从Primefaces 6.2RequestContext弃用。从此版本开始使用以下内容:

if (componentID != null && PrimeFaces.current().isAjaxRequest()) {
    PrimeFaces.current().ajax().update(componentID);
}

并从后台执行javascript使用这种方式:

PrimeFaces.current().executeScript(jsCommand);

参考:

于 2018-06-07T19:28:36.857 回答
1

只有有足够的时间研究,一切皆有可能:)

我要做的就像让人们迭代到 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 版

祝你好运,编码愉快:)

于 2019-11-19T15:00:26.653 回答
-2

为了从 backing bean 更新组件,我们可以实现如下 RequestContext.getCurrentInstance().update('updatePanelGroup');

<h:panelGroup id="updatePanelGroup">
    .....
    ....
</h:panelGroup>

更新组件的基本面版本不同。

于 2021-03-24T16:53:24.313 回答