我有一个像这样的primefaces组件:

<p:panel styleClass="errorsPanelClass" id="errorsPanel" header="Messages" toggleable="true" effect="drop" toggleSpeed="0" closeSpeed="0" widgetVar="errorsPanelWidget">

我正在尝试在javascript上下文中获取组件并对其进行更新。

我已经尝试过:
function getWidgetVarById(id) {
   for (var propertyName in PrimeFaces.widgets) {
     if (PrimeFaces.widgets[propertyName].id === id) {
       return PrimeFaces.widgets[propertyName];
     }
   }
}

要么

How to find a widgetVar?

要么

Get widgetVar with JavaScript or check/uncheck all other PrimeFaces checkboxes

如果我能找到一个按类学习widgetVar的解决方案,那将是很好的选择,但任何其他解决方案都欢迎。

我也尝试过:
function getWidgetVarById() {
    for ( var propertyName in PrimeFaces.widgets) {
        alert(PrimeFaces.widgets[propertyName].id);
    }
}

但我收到一个JavaScript错误“'PrimeFaces.widgets.length'为空或不是对象”

有任何想法吗?

最佳答案

PrimeFaces 3.5的id和widgetVar之间没有映射。在3.5中,将小部件添加到“窗口”对象,而不存储在其他位置。这意味着widgetVar已经是您可以直接使用的变量。

<p:panel id="errorsPanel" widgetVar="errorsPanelWidget">

3.5 / 4.0:(在4.0中仍然有效,但不推荐使用PF('..')方式)errorsPanelWidget.close()
5.0及更高版本:PF('errorsPanelWidget').close()(除非您配置旧版模式,否则它将表现为3.5 / 4.0)

然后最简单的方法是使用一种约定,即您将小部件名称命名为id,但后缀为id_widget。您可以(建议)将widgetVar留在外面,然后该widget与id相同(在某些情况下,这可能会导致分类,这就是PF放弃此约定的原因)。

而且您仍然可以检查3.5中的widgetVar值是否以一种或另一种方式添加到了小部件的外部html元素中。然后,您可以使用一些jquery检索它。就个人而言,我在以前的PF版本中使用了“约定”方式(将“Widget”附加到id中的值上并将其放在widgetVar属性中)

如果使用“更新”小部件,则意味着更新小部件的内容,就不能。没有refresh()类型的方法可以做到这一点。您可以做的就是将id(!)发送到服务器,并通过update(..)在其中执行requestContext,如下所示
RequestContext context = RequestContext.getCurrentInstance();
context.update("errorsPanel");

但是,更新列表服务器端的那一刻可能会更好。因此,可能是您陷入了XY陷阱。

但是,如果确实需要,这是一个使用PrimeFaces extensions remoteCommand的示例,因为这是最简单的方法)

xhtml:
<pe:remoteCommand id="refreshWidgetCommand" name="refreshWidget" process="@this" actionListener="#{updateWidgetController.refresh}">
    <pe:methodSignature parameters="java.lang.String"/>
    <pe:methodParam name="id"/>
</pe:remoteCommand>

bean 角,扁 bean :
@ManagedBean
@RequestScoped
public class UpdateWidgetController {

    public void refresh(final String id) {

        RequestContext context = RequestContext.getCurrentInstance();
        context.update(id);
    }
}

调用refreshWidget('errrosPanel');将实现您想要的。

不需要使用PFE(或由于版本不兼容而不能使用它),可以使用PF remoteCommand达到相同的效果,但是3.5的特定示例可能会有所不同

10-05 20:34