MonkeyPatching:PrimeFaces小部件扩展/覆盖

我正在使用(它工作正常)

PrimeFaces.widget.OverlayPanel.prototype._old_init = PrimeFaces.widget.OverlayPanel.prototype.init; PrimeFaces.widget.OverlayPanel.prototype.init = function(cfg) { this._old_init(cfg); this.align(); } 

但是我想使用更具可读性的东西和’jQuery-ish’这样完全发明不切实际的代码:

 PrimeFaces.widget.OverlayPanel.patch( { init: function(cfg) { super.init(cfg); this.align(); }, show: function() { console.log('blah blah blah'); super.show(); } }); 

我尝试了PrimeFaces.widget.Xxx.extend({...})但在这种情况下,我无法访问super方法。

请记住,我对Javascript完全愚蠢

谢谢

我实现了它:

 if(PrimeFaces.widget.OverlayPanel) { PrimeFaces.widget.OverlayPanel = PrimeFaces.widget.OverlayPanel.extend( { init: function(cfg) { this._super(cfg); this.align(); }, show: function() { console.log('blah blah blah'); this._super(); } }); }; 

这是存储在里面的

  • 应用
    • 资源
      • JS
        • PF-patches.js

它在全局模板中使用:

        <ui:insert name="title">#{navigatorBean.viewTitle}</ui:insert>    ==========>  <==========       ... 

我有同样的问题,但你的解决方案不是我的问题100%有效(见这里https://github.com/primefaces/primefaces/issues/1928) )因为你愿意从…调用_super() OverlayPanel ,我试图避免它(它做了一些我不想做的事情) 。 所以我做的是这样的:

 /* Quick fix so layout might be handled in dialog component PF #1928 */ if(PrimeFaces.widget.Layout) { PrimeFaces.widget.Layout.prototype.init = function(cfg) { // skip calling PrimeFaces.widget.Layout.init() on purpose PrimeFaces.widget.DeferredWidget.prototype.init.call(this, cfg); this.cfg = cfg; this.id = this.cfg.id; this.jqId = PrimeFaces.escapeClientId(this.id); if(this.cfg.full) { //full var dialog = $(this.cfg.center.paneSelector).parents('.ui-dialog-content'); if(dialog) { // full + dialog this.jq = dialog; } else { this.jq = $('body'); } } else if(this.cfg.parent) { //nested this.jq = $(PrimeFaces.escapeClientId(this.cfg.parent)); } else { //element this.jq = $(this.jqId); } this.renderDeferred(); } } 

这样init()就完全被覆盖了。 我希望在这个非典型的案例中它会帮助很少的人;)