获取 javascript 中的 primefaces widgetVar 并更新它

Get primefaces widgetVar in javascript and update it

我有一个像这样的 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

如果我能在 class 之前找到一个获取 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 中,小部件被添加到 'window' 对象中,而不是存储在其他地方。这意味着 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)

最简单的方法是使用一个约定,你将 widgetVar 命名为你的 id 但带有后缀,例如id_widget。您可以(反对它)将 widgetVar 留在外面,然后小部件与 id 相同(这在某些情况下会导致分类,这就是 PF 放弃此约定的原因)。

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

如果使用 'updating' 小部件,你的意思是更新小部件的内容,你不能。没有 refresh() 种方法可以做到这一点。你可以做的是将 id(!)

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>  

豆子:

@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的具体例子可能有点不同