在javascript中获取primefaces widgetVar并更新它

Adi*_*tzu 4 javascript jsf primefaces

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

<p:panel styleClass="errorsPanelClass" id="errorsPanel" header="Messages" toggleable="true" effect="drop" toggleSpeed="0" closeSpeed="0" widgetVar="errorsPanelWidget">
Run Code Online (Sandbox Code Playgroud)

我试图在javascript上下文中获取组件并更新它.

我已经尝试过:

function getWidgetVarById(id) {
   for (var propertyName in PrimeFaces.widgets) {
     if (PrimeFaces.widgets[propertyName].id === id) {
       return PrimeFaces.widgets[propertyName];
     }
   }
}
Run Code Online (Sandbox Code Playgroud)

要么

如何找到widgetVar?

要么

使用JavaScript获取widgetVar或选中/取消选中所有其他PrimeFaces复选框

如果我找到一个按类来获取widgetVar的解决方案,那将会很棒,但欢迎任何其他解决方案.

我也尝试过:

function getWidgetVarById() {
    for ( var propertyName in PrimeFaces.widgets) {
        alert(PrimeFaces.widgets[propertyName].id);
    }
}
Run Code Online (Sandbox Code Playgroud)

但我得到一个javascript错误"'PrimeFaces.widgets.length'为null或不是对象"

有任何想法吗?

Kuk*_*tje 9

对于PrimeFaces 3.5,id和widgetVar之间没有映射.在3.5中,小部件被添加到"窗口"对象中,而不是存储在其他位置.这意味着widgetVar已经是一个可以使用的变量.

<p:panel id="errorsPanel" widgetVar="errorsPanelWidget">
Run Code Online (Sandbox Code Playgroud)

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版本中使用了"约定"方式(将'Widget'附加到也在id中的值并将其放在widgetVar属性中)

如果"更新"小部件,则意味着更新小部件的内容,您不能.没有refresh()一种方法可以做到这一点.你可以做的是将id(!)发送到服务器并update(..)通过requestContext这样的方式执行

RequestContext context = RequestContext.getCurrentInstance();
context.update("errorsPanel");
Run Code Online (Sandbox Code Playgroud)

但是,在更新列表服务器端时,这可能会更好.所以可能是你陷入了XY陷阱.

但如果确实需要,这里有一个例子,使用PrimeFaces扩展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>  
Run Code Online (Sandbox Code Playgroud)

豆:

@ManagedBean  
@RequestScoped  
public class UpdateWidgetController {  

    public void refresh(final String id) {  

        RequestContext context = RequestContext.getCurrentInstance();
        context.update(id);
    }
}
Run Code Online (Sandbox Code Playgroud)

调用refreshWidget('errrosPanel'); 将实现你想要的.

不要使用PFE(或由于版本不兼容而无法使用此功能),您可以使用PF remoteCommand实现相同但3.5的具体示例可能略有不同