我有一个像这样的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];
}
}
}
或
或
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;
有什么想法吗?
答案 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的具体示例可能会有所不同一点点