2010-06-02 14 views

Répondre

10

celui-ci fonctionne

%script 
    - 10.upto(20) do |i| 
    document.getElementById('aDiv').innerHTML += '#{i}'; 
+0

fonctionne. bien que type = 'text/javascript' et que CDATA soit manquant, cela fonctionne toujours. –

4

Je voulais juste ajouter que les éléments suivants vous obtient le type et CDATA, mais sans le comportement funky de: javascript (je viens de mettre en œuvre quelque chose avait comme ça).

%script{ :type => 'text/javascript' } 
    \//<![CDATA[ 
    - (10..20) do |i| 
    document.getElementById('aDiv').innerHTML += '#{i}'; 
    \//]]> 
13
%html 
    %head 
    :javascript 
     var foo = []; 
     #{ 
     limit = rand(4)+3 
     array = (0..limit).to_a 
     array.map{ |i| "foo[#{i}] = #{rand(12)};" }.join ' ' 
     } 
     console.log(foo.length); 
    %body 

Exécution du code ci-dessus donne cette sortie:

<html> 
    <head> 
    <script type='text/javascript'> 
     //<![CDATA[ 
     var foo = []; 
     foo[0] = 2; foo[1] = 0; foo[2] = 11; foo[3] = 8; foo[4] = 0; foo[5] = 1; 
     //]]> 
    </script> 
    <body></body> 
    </head> 
</html> 

Comme vous pouvez le voir, le grand bloc #{...} (qui peut couvrir plusieurs lignes) exécute le code arbitraire Ruby. Le résultat de la dernière expression (dans ce cas le map{...}.join) est converti en une chaîne et placé dans la sortie.

Modifier pour Radek: Si vous voulez déclarer une variable à l'intérieur vous modèle Haml, dans votre filtre JavaScript (ce qui semble être un désir étrange), alors vous devez être sûr que le résultat du bloc to_s n » t produire une sortie non désirée:

ce Haml ...

%p 
    :javascript 
    var foo = 12; 
    #{x = 42} 
    var bar = #{x}; 

... produit ce HTML:

<p> 
    <script type='text/javascript'> 
    //<![CDATA[ 
     var foo = 12; 
     42 
     var bar = 42; 
    //]]> 
    </script> 
</p> 

considérant que cette Haml ...

%p 
    :javascript 
    var foo = 12; 
    #{x = 42; ""} 
    var bar = #{x}; 

... ce produit HTML ...

<p> 
    <script type='text/javascript'> 
    //<![CDATA[ 
     var foo = 12; 

     var bar = 42; 
    //]]> 
    </script> 
</p> 

Mais avant de faire cela, demandez-vous: pourquoi suis-je en train de créer des variables complexes Ruby dans mon vue?
Cette variable n'aurait-elle pas dû être déclarée par mon contrôleur?

+0

Et si je voulais juste définir une variable? à l'intérieur du bloc ': javascript'? – Radek

+0

@Radek Mis à jour. – Phrogz

+0

bonne explication, merci – Radek