2016-05-01 17 views
2

Ich versuche, OmniFaces zu verwenden, um PrimeFaces-Skripts zu verzögern, wie in diesem answer zu sehen ist.So verschieben Sie PrimeFaces.settings und clientseitige Validierungsskripte mit o: defendedScript

Aber PrimeFaces macht einen Inline-Skript in dem Kopf, wie diese (Skript von mir verschönert und kommentiert):

<script type="text/javascript"> 
    if(window.PrimeFaces) { 
     // this line is always rendered in Development mode. 
     PrimeFaces.settings.projectStage='Development'; 
     // these lines are added if Client Side Validation is enabled. 
     PrimeFaces.settings.locale='pt_BR'; 
     PrimeFaces.settings.validateEmptyFields=true; 
     PrimeFaces.settings.considerEmptyStringNull=true; 
    } 
</script> 

Wenn ich die Anwendung ausführen, bekomme ich einige JS-Fehler (Datei und Fehler):

validation.js.xhtml?ln=primefaces&v=5.3:1 
Uncaught TypeError: Cannot read property 'en_US' of undefined 

beanvalidation.js.xhtml?ln=primefaces&v=5.3:1 
Uncaught TypeError: Cannot read property 'en_US' of undefined 

produto.xhtml:2 
Uncaught TypeError: Cannot set property 'locale' of undefined 

Wenn ich habe einige Variablen in primefaces.deferred.js, wie folgt aus:

if (!primeFacesLoaded) { 
    window.PrimeFaces = { 
     // variables added - begin 
     settings: { 
      projectStage: 'Development', 
      locale: 'pt_BR', 
      validateEmptyFields: true, 
      considerEmptyStringNull: true 
     }, 
     // variables added - end 
     ab: function() { 
      defer("ab", arguments); 
     }, 
     cw: function() { 
      defer("cw", arguments); 
     }, 
     focus: function() { 
      defer("focus", arguments); 
     } 
    }; 
} 

Die beiden f Es treten immer noch erste Fehler auf, aber der dritte Fehler verschwindet.

Offenbar fehlt es dem PrimeFaces JS Objekt die folgenden Eigenschaften:

locales: { 
    // other values... 
    en_US: { 
     // other values... 
    } 
}, 
util: { 
    // other values... 
}, 

Also, die Frage ist: Wie kann man diese PrimeFaces Skripteigenschaften korrekt verschieben?

P. S: Versionen: PrimeFaces 5.3, 2.3 OmniFaces, Payara Server (Glassfish) 4.1.1.161

Antwort

0

Die PrimeFaces.settings eingeführt wurde, nachdem the answer gebucht wurde. Die Antwort wurde inzwischen aktualisiert, um dies zu berücksichtigen. Die aktualisierte Skript ist:

DeferredPrimeFaces = function() { 
    var deferredPrimeFaces = {}; 
    var calls = []; 
    var settings = {}; 
    var primeFacesLoaded = !!window.PrimeFaces; 

    function defer(name, args) { 
     calls.push({ name: name, args: args }); 
    } 

    deferredPrimeFaces.begin = function() { 
     if (!primeFacesLoaded) { 
      settings = window.PrimeFaces.settings; 
      delete window.PrimeFaces; 
     } 
    }; 

    deferredPrimeFaces.apply = function() { 
     if (window.PrimeFaces) { 
      for (var i = 0; i < calls.length; i++) { 
       window.PrimeFaces[calls[i].name].apply(window.PrimeFaces, calls[i].args); 
      } 

      window.PrimeFaces.settings = settings; 
     } 

     delete window.DeferredPrimeFaces; 
    }; 

    if (!primeFacesLoaded) { 
     window.PrimeFaces = { 
      ab: function() { defer("ab", arguments); }, 
      cw: function() { defer("cw", arguments); }, 
      focus: function() { defer("focus", arguments); }, 
      settings: {} 
     }; 
    } 

    return deferredPrimeFaces; 
}(); 

Grundsätzlich bereiten gerade die Eigenschaft als leeres Objekt, kopieren Sie sie während begin und es dann während apply eingestellt.

Was PrimeFaces validation.js und beanvalidation.js Dateien aufzuschieben, erfordert dies einen benutzerdefinierten Renderer für <h:head>, wie PrimeFaces man sie eigentlich Hardcodes anstatt sie als @ResourceDependency erklärt. Ein konkretes Beispiel finden Sie in wiki of CombinedResourceHandler.

package com.example; 

import java.io.IOException; 

import javax.faces.application.ResourceDependencies; 
import javax.faces.application.ResourceDependency; 
import javax.faces.component.UIComponent; 
import javax.faces.context.FacesContext; 
import javax.faces.render.Renderer; 

@ResourceDependencies({ 
    @ResourceDependency(library="primefaces-aristo", name="theme.css"), 
    @ResourceDependency(library="primefaces", name="primefaces.js"), // Only necessary when at least one validation JS files needs to be included. 
    @ResourceDependency(library="primefaces", name="validation/validation.js"), // Only necessary when you need <p:clientValidator>. 
    @ResourceDependency(library="primefaces", name="validation/beanvalidation.js") // Only necessary when you use JSR303 bean validation. 
}) 
public class HeadRenderer extends Renderer { 

    @Override 
    public void encodeBegin(FacesContext context, UIComponent component) throws IOException { 
     context.getResponseWriter().startElement("head", component); 
    } 

    @Override 
    public void encodeChildren(FacesContext context, UIComponent component) throws IOException { 
     // NOOP. 
    } 

    @Override 
    public void encodeEnd(FacesContext context, UIComponent component) throws IOException { 
     for (UIComponent resource : context.getViewRoot().getComponentResources(context, "head")) { 
      resource.encodeAll(context); 
     } 

     context.getResponseWriter().endElement("head"); 
    } 

} 

, um sie zu erhalten zu laufen, registrieren, wie in faces-config.xml folgt:

<render-kit> 
    <renderer> 
     <component-family>javax.faces.Output</component-family> 
     <renderer-type>javax.faces.Head</renderer-type> 
     <renderer-class>com.example.HeadRenderer</renderer-class> 
    </renderer> 
</render-kit> 
+0

Mit diesem Skript, ich habe immer noch Probleme mit den Lokalisierungs und util Variablen. Vorschlag: Um das Kopieren vieler Variablen zu vermeiden, was passiert, wenn wir das gesamte window.PrimeFaces-Objekt auf eine andere Variable klonen, ab, cw, focus-Funktionen verzögern und das Objekt später wiederherstellen? – julianomqs

+0

Ich sehe, PrimeFaces hat diese Validierung hartcodiert eingereicht. Siehe aktualisierte Antwort. – BalusC

+0

2 Fragen: 1) Ich habe eine 'scripts.js', die' PrimeFaces.locales ['pt_BR'] 'Werte (zum Kalender) setzt. Soll ich dieses Skript zwischen 'DefredredPrimeFaces.begin()' und 'DeferredPrimeFaces.apply()' setzen? 2) Ich muss Skripte angeben, die auf jeder Seite verschoben werden sollen, oder kann ich sie in eine Vorlage einfügen? – julianomqs