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