【问题标题】:Get primefaces widgetVar in javascript and update it在javascript中获取primefaces widgetVar并更新它
【发布时间】:2015-04-20 23:37:21
【问题描述】:

我有一个这样的 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' 为空或不是对象”

有什么想法吗?

【问题讨论】:

  • 如果(仅用于测试)您执行PF('errorsPanelWidget') 会怎样?既然这应该有效,而且如果有效,那就很奇怪了,因为它在内部做了一个PrimeFaces.widgets[widgetVar],这将与“null”相矛盾,或者不是长度的对象。
  • 我发出警报(PF('errorsPanelWidget'));我得到“预期对象”错误:(
  • 那么你有一个完全不同的问题。你用的是什么版本的PF? alert(PrimeFaces.widgets) 有什么作用?发布一个最小但完全有效的 xhtml 示例
  • 我正在使用 Primefaces 3.5
  • 如果重要的话,这个组件是在另一个 xhtml 文件中使用的自定义组件中。我检查并正确呈现

标签: javascript jsf primefaces


【解决方案1】:

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)

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

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

如果“更新”小部件,你的意思是更新小部件的内容,你不能。没有refresh() 类型的方法可以做到这一点。您可以做的是将 id(!) 发送到服务器并通过 requestContext 执行 update(..) 像这样

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

【讨论】:

  • 非常感谢!现在它似乎工作了,但我现在可以更新这个对象还是重新渲染它?
  • Lol errorsPanelWidget.close() 正在工作,但是当我调用 errorsPanelWidget.refresh() 时出现错误“id 为空或不是对象”:-s
  • PF() 快捷方式在 4.0 中也可用,但不是 5.0 及更高版本:)
  • 是的,正确,但“旧”版本仍然有效,只是被弃用了。在 5.0 中您必须切换,而在 5.0.x 和 5.1 中添加了旧版切换
  • 每次我接受一个解决我问题的答案。标题问题是“在 javascript 中获取 primefaces widgetVar 并更新它”,直到现在我只做了第一部分。不要理解我的错误,但如果我接受你的回答,这意味着我的问题已经解决,这是不正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-19
  • 1970-01-01
  • 1970-01-01
  • 2013-12-28
  • 2015-02-17
相关资源
最近更新 更多