Mélange de JSF EL dans un fichier JavaScript

Est-il un moyen d'avoir Expression de la Langue (EL) les expressions inclus les fichiers JavaScript être évalué par JSF?

J'espérais que la Couture peut avoir un moyen de contourner cela, mais pas de chance jusqu'à présent. Tout ce que je veux est de pouvoir utiliser des messages localisés dans mes fonctions JavaScript qui sont partagés entre les pages.

38
demandé sur Peter Mortensen 2010-03-30 22:52:31

2 réponses

Cinq façons:

  1. Déclarez - le comme variable globale dans la page JSF parent.

    <script type="text/javascript" src="script.js"></script>
    <script type="text/javascript">
        var messages = [];
        <ui:repeat value="#{bean.messages}" var="message">
            messages['#{message.key}'] = '#{message.value}';
        </ui:repeat>
    </script>
    

    Ou, si c'est déjà au format JSON.

    <script type="text/javascript" src="script.js"></script>
    <script type="text/javascript">var messages = #{bean.messagesAsJson};</script>
    
  2. Mettez l'ensemble <script> dans un fichier XHTML et utilisez ui:include pour l'inclure.

    <script type="text/javascript" src="script.js"></script>
    <ui:include src="script-variables.xhtml" />
    
  3. Passez *.js à travers le JspServlet (seulement s'il suffit d'évaluer uniquement les expressions ${}). Par exemple, dans web.xml (le <servlet-name> de JspServlet peut être trouvé dans web.xml du servletcontainer en question, c'est généralement jsp).

    <servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.js</url-pattern>
    </servlet-mapping>
    
  4. Faire usage de" bon vieux " JSP avec un type de contenu modifié. Renommez script.js en script.jsp et ajoutez la ligne suivante en haut de JSP (seulement s'il suffit d'évaluer uniquement les expressions ${}):

    <%@page contentType="text/javascript" %>
    
  5. Laissez JS obtenir les données ajaxiquement pendant le chargement. Voici un exemple ciblé jQuery.

    $.getJSON('json/messages', function(messages) {
        $.each(messages, function(key, value) {
            $.messages[key] = value;
        });
    });
    
62
répondu BalusC 2014-11-25 06:43:43

Comme je n'aime pas les techniques qui ne permettent pas au navigateur de mettre en cache les chaînes localisées, j'ai utilisé la technique suivante pour localiser les alertes JavaScript, etc. Cela semble un bon ajustement si les chaînes dont vous avez besoin dans votre code JavaScript sont différentes de celles nécessaires au serveur Web:

<h:head>
    <h:outputScript library="javascript" name="#{fw.JsFwStrings}" />
    ...

J'attribue ensuite la chaîne de ressource JsFwStrings au nom de fichier du fichier JavaScript définissant les chaînes localisées pour le langage donné.

Par exemple, le fw_en.fichier de propriétés contient l'entrée JsFwStrings=JsFwStrings_en.js

Et le JsFwStrings_en.le fichier JS contient

var TosFramework = TosFramework || {};
TosFramework.Strings = {
    UnSavedChangesWarning : 'You have unsaved changes.',
    CancelConfirmQuestion : 'Are you sure you want to cancel?'
}
2
répondu timr 2015-05-04 16:49:23