MonkeyPatching: PrimeFaces widgets extend/override

前端 未结 2 567
無奈伤痛
無奈伤痛 2021-01-06 07:21

I\'m currently using (it\'s working fine)

PrimeFaces.widget.OverlayPanel.prototype._old_init = PrimeFaces.widget.OverlayPanel.prototype.init;
PrimeFaces.widg         


        
相关标签:
2条回答
  • 2021-01-06 07:53

    I've achieved it:

    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();
            }
        });
    };
    

    this is stored inside

    • app
      • resources
        • js
          • pf-patches.js

    and it's used in global template:

    <!DOCTYPE html>
    <html lang="#{userBean.locale.language}" xmlns="http://www.w3.org/1999/xhtml" 
        xmlns:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:h="http://xmlns.jcp.org/jsf/html"
        xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:cc="http://xmlns.jcp.org/jsf/composite"
        xmlns:c="http://xmlns.jcp.org/jsp/jstl/core" xmlns:fn="http://xmlns.jcp.org/jsp/jstl/functions"
        xmlns:p="http://primefaces.org/ui" xmlns:pe="http://primefaces.org/ui/extensions"
        xmlns:o="http://omnifaces.org/ui" xmlns:of="http://omnifaces.org/functions"
        xmlns:s="http://shapeitalia.com/jsf2" xmlns:sc="http://xmlns.jcp.org/jsf/composite/shape"
        xmlns:e="http://java.sun.com/jsf/composite/cc" xmlns:et="http://shapeitalia.com/edea2"
        xmlns:pt="http://xmlns.jcp.org/jsf/passthrough">
    
    <f:view locale="#{userBean.locale}" contentType="text/html">
        <h:head>
            <f:facet name="first">
                <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" />
                <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
                <title><ui:insert name="title">#{navigatorBean.viewTitle}</ui:insert></title>
                <link rel="shortcut icon" type="image/x-icon" href="#{resource['favicon/favicon.ico']}" />
            </f:facet>
    
            <f:facet name="last">
    ==========> <h:outputScript name="js/pf-patches.js" /> <==========
                <h:outputScript library="omnifaces" name="fixviewstate.js" />
            </f:facet>
        </h:head>
    
        <h:body>
            <h:outputStylesheet name="theme/custom.css" />
            <h:outputStylesheet name="theme/other-icons.css" />
    
            ...
    
    0 讨论(0)
  • 2021-01-06 08:12

    I had the same problem, but you're solution was not 100% efficient to my problem (See here https://github.com/primefaces/primefaces/issues/1928)) since you're willing to call _super() from OverlayPanel, and I'm trying to avoid it (it does few things I did not want to). So what I did is this:

    /* 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();
        }
    }
    

    That way init() is completely overrided. I hope it will help few folks out there in this atypical case ;)

    0 讨论(0)
提交回复
热议问题