代码之家  ›  专栏  ›  技术社区  ›  nonopolarity

有没有一种方法可以在haml的:javascript区域内使用Ruby循环?

  •  13
  • nonopolarity  · 技术社区  · 14 年前

    在HAML内部,我们可以在:javascript区域内有一个循环吗?

    这将起作用:

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

    这不会:

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

    上面的代码也可以工作吗?

    3 回复  |  直到 13 年前
        1
  •  11
  •   zed_0xff    14 年前

    这一作品

    %script
      - 10.upto(20) do |i|
        document.getElementById('aDiv').innerHTML += '#{i}';
    
        2
  •  13
  •   Phrogz    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
    

    运行上述代码将得到以下输出:

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

    如你所见,大 #{...} 块(可以跨多行)运行任意Ruby代码。最后一个表达式的结果(在本例中, map{...}.join )转换为字符串并放入输出中。

    RADEK编辑 :如果要在HAML模板内、JavaScript筛选器内声明变量(这似乎是一个奇怪的愿望),则需要确保块的结果 to_s 不会产生不需要的输出:

    这个汉堡…

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

    …生成此HTML:

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

    然而这个村子…

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

    但在您这样做之前,先问问自己:为什么我要在我的视图中创建复杂的Ruby变量?
    我的控制器不应该声明这个变量吗?

        3
  •  4
  •   Dave Rapin    13 年前

    只是想补充一下,下面的代码可以为您提供类型和CDATA,但是没有javascript的古怪行为(我只需要实现类似的东西)。

    %script{ :type => 'text/javascript' }
      \//<![CDATA[
      - (10..20) do |i|
        document.getElementById('aDiv').innerHTML += '#{i}';
      \//]]>