在javascript中获取primefaces widgetVar并更新它

时间:2015-02-19 14:58:27

标签: javascript jsf primefaces

我有一个像这样的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错误&#34;&#39; PrimeFaces.widgets.length&#39;是null或不是对象&#34;

有什么想法吗?

1 个答案:

答案 0 :(得分:9)

PrimeFaces 3.5的id和widgetVar之间没有映射。在3.5中,小部件被添加到&#39;窗口&#39;对象而不是存储在其他地方。这意味着widgetVar已经是一个可以使用的变量。

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

3.5 / 4.0:(在4.0中,这仍然有效但不赞成使用PF(&#39; ..&#39;)方式) errorsPanelWidget.close()

5.0及以上: PF('errorsPanelWidget').close()(除非您配置传统模式,之后它将表现为3.5 / 4.0)

最简单的方法是使用一个约定,您将widgetVar命名为您的id,但使用后缀,例如id_widget。你可以(建议反对它)将widgetVar保留下来,然后小部件与id一致(这可能导致案例中的类,这就是PF放弃这个约定的原因)。

你仍然可以检查是否在3.5中,widgetVar值以某种方式添加到窗口小部件的外部html元素中。然后你可以用一些jquery来检索它。就我个人而言,我使用的是&#39;惯例&#39;在之前的PF版本中的方式(将“Widget”添加到同样位于id并将其放入widgetVar属性中的值)

如果更新&#39;小部件,你的意思是更新小部件的内容,你不能。没有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>  

豆:

@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的具体示例可能会有所不同一点点