2010-06-02 6 views

Antwort

10

diese funktioniert

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

funktioniert. obwohl type = 'text/javascript' und CDATA fehlen, funktioniert es trotzdem. –

4

einfach hinzufügen wollte, dass die folgende bekommt man die Art und CDATA, aber ohne die flippige Verhalten: javascript (Ich hatte gerade etwas zu implementieren).

%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 

den obigen Code Lauf gibt diese Ausgabe:

<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> 

Wie Sie sehen können, der große #{...} Block (die über mehrere Zeilen erstrecken kann) läuft beliebigen Code Rubin. Das Ergebnis des letzten Ausdrucks (in diesem Fall map{...}.join) wird in einen String konvertiert und in die Ausgabe eingefügt.

Edit für Radek: Wenn Sie eine Variable innerhalb Sie Haml Vorlage, in Ihrem JavaScript-Filter erklären wollen (die wie eine seltsame Verlangen scheint), dann müssen Sie sicher sein, dass das Ergebnis des Blocks to_s doesn‘ t produzieren unerwünschte Ausgabe:

Diese Haml ...

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

... erzeugt HTML:

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

Während dieser Haml ...

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

... HTML ...

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

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

Aber bevor Sie dies tun, fragen Sie sich, produziert: warum erschaffe ich komplexe Ruby-Variablen in meinem Aussicht?
Sollte diese Variable nicht von meinem Controller deklariert worden sein?

+0

Was ist, wenn ich nur eine Variable definieren möchte? innerhalb ': javascript' block? – Radek

+0

@Radek Aktualisiert. – Phrogz

+0

großartige Erklärung, danke – Radek

Verwandte Themen