我能否从JSF后端bean方法更新JSF组件?

112

是否有一种方式让JSF后备bean更新页面上的组件? 我不想使用具有更新属性的ajax组件来更新页面上的组件。 我需要从JSF后台bean方法中触发更新。 请注意,页面上的更新可以在此方法完成之后或之前发生。 如果可以从PrimeFaces使用解决方案,则我正在使用PrimeFaces。


可能会触发验证错误:https://dev59.com/T2Yq5IYBdhLWcg3wixJr#14401741 - Andrew
5个回答

212
使用标准的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分隔符字符的相对客户端ID。

6
似乎我无法在“渲染响应”阶段使其工作(不幸的是,这是我被迫放置此代码的位置)。如果我将其放置在“调用应用程序”或更早的阶段,一切都正常。有没有在“渲染响应”阶段的解决方法? - BestPractices
8
不行,太晚了。将工作移到调用动作阶段或渲染响应阶段之前。通过 <f:ajax listener><f:event type="preRenderView" listener> 调用方法。 - BalusC
@DanielK:不知道。我不用Trinidad。如果你还是搞不清楚Trinidad的方法,就使用标准的JSF API方法。 - BalusC
当我这样做时,在对话框中失去了表单提交操作调用,如果我不进行上下文更新,则可以正常工作。请参见此处:http://stackoverflow.com/questions/31350850/pdialog-form-submission-loses-action-method-after-requestcontext-update - amphibient
@amphibient:更新对话框的表单而不是对话框本身。 - BalusC
显示剩余3条评论

10

我也尝试从一个JSF后台bean/class更新一个组件

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

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

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


8

2

只要有足够的时间进行研究,一切都是可能的 :)

我的任务类似于将人们迭代到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

祝好运并愉快编码 :)


如果您在 personType 上有 ajax 更改事件,那么将人员和索引都传递给 ajax 监听器是多余的。您可以从事件中获取 id 和值。但是,您的解决方案可能是特定用例所需的,但由于没有完整的示例(以 [mcve] 格式),因此很难确定。 - Kukeltje

-2
为了从后端bean更新组件,我们可以按如下方式实现: RequestContext.getCurrentInstance().update('updatePanelGroup');
<h:panelGroup id="updatePanelGroup">
    .....
    ....
</h:panelGroup>

更新组件与原始版本不同。


这是BalusC在他的回复中提到的,比你的回复早了9年... - Betlista

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接