为什么Primefaces 5.3中的AJAX更新有效

为什么Primefaces 5.3中的AJAX更新有效,primefaces,Primefaces,我使用的是Primefaces 5.0,当我用AJAX更新p:SelectCheckBox菜单时,它停止了工作。经过一些研究,我了解到它的监听器被破坏了,因为HTMLDOM树被注入了新的HTML组件(在AJAX响应中返回),并且由于ready()没有被重新调用,监听器没有被重新连接 当我升级到Primefaces 5.3(使用相同的代码)时,AJAX更新开始工作 我以为他们换了 $(选择器).on(事件,函数){…}和$(文档).on(事件,选择器,函数){…},将侦听器绑定到文档而不是组件。。

我使用的是Primefaces 5.0,当我用AJAX更新p:SelectCheckBox菜单时,它停止了工作。经过一些研究,我了解到它的监听器被破坏了,因为HTMLDOM树被注入了新的HTML组件(在AJAX响应中返回),并且由于ready()没有被重新调用,监听器没有被重新连接

当我升级到Primefaces 5.3(使用相同的代码)时,AJAX更新开始工作

我以为他们换了 $(选择器).on(事件,函数){…}和$(文档).on(事件,选择器,函数){…},将侦听器绑定到文档而不是组件。。。但是他们保留了$(选择器).on(事件,函数){…}方法


他们是如何解决这个问题的?那么监听器是如何连接到新组件的?

由于转义的客户端ID,更新正在工作。按照@Kukeltje的建议,重写刷新函数后,我可以测试它。 PrimeFaces.escapeClientId函数它是一个js函数,用于将冒号“:”替换为双反斜杠。由于这一更正,Primefaces 5.3中的AJAX更新工作正常

出于测试目的,我覆盖了SelectCheckboxMenu的刷新功能,添加了一个打印以确保调用它,并将5.3刷新替换为5.0刷新

PrimeFaces.widget.SelectCheckboxMenu.prototype.refresh = function(a) {
        console.log('method overriden!');
        $(this.panelId).remove();
        this.init(a)
}

正如所怀疑的那样,刷新停止工作,确认之前没有转义ID

最有可能的方法是重新执行组件的完整javascript并在响应中调用。在这两个版本中,PrimeFaces.widget.SelectCheckboxMenu的刷新函数(AJAX响应)从DOM、其数据和侦听器中删除组件,并重新执行init函数(创建组件和绑定事件)。这已经在Primefaces 5.0中完成了!我发现的唯一区别是组件ID开始被转义,但我想确定这是错误还是其他原因。不幸的是,我无法更改primefaces.js来尝试primefaces 5.0 js文件中的组件,因为您可以覆盖单个函数。也许值得一试?
PrimeFaces.widget.BaseWidget.refresh
在core.js中
PrimeFaces.createWidget
调用它。否,在PrimeFaces.js中刷新。core.js中的Refresh在两个版本中似乎做了相同的事情,只是最新版本的代码更优雅。我将探讨覆盖建议。谢谢你们两位。