2016-04-13 5 views
2

настоящее время я использую (это работает отлично)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-иш», как этот полностью изобретенной нереалистичным код:

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

Благодаря

+0

Что вы имеете в виду: «все виджеты такого рода»? Все наложения или все другие типы? Если это первый, просто включите его в шаблон своей страницы. – Kukeltje

+0

Вы правы, это вздор - исключен из вопроса. Достаточно включить скрипт после объявления виджета и до создания экземпляра * PrimeFaces.cw (...) * –

+0

Хорошо, ясно. Я попробовал «продлить» один раз, но не смог. Часто более красивый код лучше, но в этом случае я не буду тратить время, чтобы посмотреть дальше, но использовать его так, как он работает (это не **, что ** уродливый ;-)) – Kukeltje

ответ

4

Я достиг этого:

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

это хранится внутри

  • приложение
    • ресурсы
      • расслоение плотной
        • пф-patches.js

и используется в глобальном шаблоне:

<!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" /> 

     ... 
+1

и где вы положите это? (this._super (cfg) не работал для меня btw тогда (1,5 года назад), если я правильно помню) ... И я замечаю, что вы только добавляете функциональность * после * супер звонков ... возможно, это сработало бы назад, но мне нужно было изменить код в нем ... Отлично это работает, хотя и спасибо за отчетность – Kukeltje

+0

, используемую в последнем аспекте головы. см. обновление. –

-1

У меня была такая же проблема, но вы решение не было 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() полностью перекрытая. Я надеюсь, что это поможет немногим людям в этом нетипичном случае;)

+2

Как вы можете видеть в вопросе, на самом деле цель состоит в том, чтобы иметь доступ к методам 'super'. Однако, используя код в моем собственном ответе без вызова 'this._super (...)', результат * полностью отменяется *.По этим двум причинам я не вижу, какая добавленная стоимость вашего ответа. –

+0

Ну, я искал решение моей проблемы. Через https://jsf.zeef.com/bauke.scholtz я прочитал «Расширить/переопределить PrimeFaces.widget в JS», что совершенно точно то, что я хочу сделать. Ваше решение помогло мне начать, я просто подумал, что ваша проблема не совсем похожа на мою. Но все же стоило того, чтобы поделиться этим решением. Для этого это добавленная ценность для людей, которые хотят, поскольку в теме говорилось: «Расширять/переопределять виджеты PrimeFaces». Если вы подумаете, что это бесполезно, я просто удалю свой пост (поскольку я не пытаюсь напрямую ответить на вашу проблему, но добавляю к нему ценность, к которой это может относиться) – Rapster

+1

Я все еще думаю, что это именно то, что я пытался избежать, но это по-прежнему «законный» код, и я не тот, кто скажет вам удалить или оставить его, вы можете делать все, что захотите. Тем не менее, я не смогу (и не смогу) удалить свой нисходящий канал, пока вы не отредактируете свой ответ с помощью некоторого, ИМХО, ценного контента. Сожалею. –