40 votes

Mélange de JSF EL dans un fichier JavaScript

Y a-t-il un moyen d'avoir Langage d'expression Les expressions (EL) incluses dans les fichiers JavaScript sont évaluées par JSF ?

J'espérais que Seam pourrait avoir un moyen de contourner ce problème, mais je n'ai pas eu de chance jusqu'à présent. Tout ce que je veux, c'est pouvoir utiliser des messages localisés dans mes fonctions JavaScript qui sont partagées entre plusieurs pages.

66voto

BalusC Points 498232

Cinq façons :

  1. Déclarez-la 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, s'il 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 utiliser 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 est suffisant d'évaluer uniquement les ${} expressions). Par exemple, dans web.xml (le <servlet-name> de JspServlet peuvent être trouvés dans web.xml du récipient de service en question, il est généralement jsp ).

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

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

    $.getJSON('json/messages', function(messages) {
        $.each(messages, function(key, value) {
            $.messages[key] = value;
        });
    });

2voto

timr Points 1

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. Cette technique semble bien adaptée si les chaînes de caractères dont vous avez besoin dans votre code JavaScript sont différentes de celles dont le serveur Web a besoin :

<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 la langue donnée.

Par exemple, le fichier fw_en.properties contient l'entrée suivante JsFwStrings=JsFwStrings_fr.js

Et le fichier JsFwStrings_fr.js contient

var TosFramework = TosFramework || {};
TosFramework.Strings = {
    UnSavedChangesWarning : 'You have unsaved changes.',
    CancelConfirmQuestion : 'Are you sure you want to cancel?'
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X