gpt4 book ai didi

javascript - 有没有办法在 HAML 的 :javascript region? 中使用 Ruby 循环

转载 作者:可可西里 更新时间:2023-11-01 01:38:12 25 4
gpt4 key购买 nike

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

这会起作用:

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

这不会:

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

上面的代码也能正常工作吗?

最佳答案

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

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

为 Radek 编辑:如果您想在 Haml 模板中声明一个变量,在您的 JavaScript 过滤器中(这似乎是一个奇怪的愿望),那么您需要确保 block 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>

而这个 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>

但在你这样做之前,问问你自己:为什么我要在我的 View 中创建复杂的 Ruby 变量?
我的 Controller 不应该声明这个变量吗?

关于javascript - 有没有办法在 HAML 的 :javascript region? 中使用 Ruby 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2962119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com