我可以从JSF支持bean方法更新JSF组件吗?

时间:2012-07-06 15:22:13

标签: jsf-2 primefaces

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

5 个答案:

答案 0 :(得分:161)

使用标准JSF API,将客户端ID添加到PartialViewContext#getRenderIds()

FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add("foo:bar");

使用PrimeFaces特定API,使用RequestContext#update()

RequestContext.getCurrentInstance().update("foo:bar");

从PrimeFaces 6.2 RequestContext#update()已被弃用,请改用PrimeFaces::Ajax#update

PrimeFaces.current().ajax().update("foo:bar");

如果您碰巧使用JSF实用程序库OmniFaces,请使用Ajax#update()

Ajax.update("foo:bar");

无论如何,请注意,这些客户端ID应代表绝对客户端ID,这些客户端ID 前缀为NamingContainer分隔符,就像在视图侧一样。< / p>

答案 1 :(得分:9)

我还尝试从jsf支持bean / class

更新组件

操作UI组件后需要执行以下操作:

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

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

非常重要

答案 2 :(得分:5)

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

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

要从backbean执行 javascript ,请使用以下方式:

PrimeFaces.current().executeScript(jsCommand);

参考:

答案 3 :(得分:0)

只有在有足够的时间进行研究的情况下,一切皆有可能:)

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

祝你好运,编码愉快:)

答案 4 :(得分:-1)

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

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

更新组件因 prima face 版本而异。