我有一个像这样的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的特定示例可能会有所不同