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
- JS
- 资源
它在全局模板中使用:
#{navigatorBean.viewTitle} ==========> <========== ...
我有同样的问题,但你的解决方案不是我的问题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()
就完全被覆盖了。 我希望在这个非典型的案例中它会帮助很少的人;)