HAML中的动态生成Javascript

4

为什么这个不起作用?

:javascript
    -[1,2,3].each do |number|
        $("#form_#{number}").my_method();

Rails 给出错误提示,说变量 number 没有定义。
2个回答

6
过滤器的内容不会被解释为 Haml。但是你可以使用 #{...} 进行插值,这就是你看到错误的原因——过滤器在 #form_#{number} 中看到了 #{number},但是上面定义 number 的那一行只是按原样传递,没有被当作 Ruby 处理,所以对于 Ruby 来说,number 仍然未定义。
在这种情况下,你可以做如下操作:
:javascript
    #{[1,2,3].map do |number|
        "$(\"#form_#{number}\").my_method();"
    end.join("\n")}

尽管这有点不太方便,但更清晰的解决方法可能是创建一个帮助方法来创建javascript代码,你可以从过滤器中调用它:
def create_js(arr)
  arr.map do |number|
      "$(\"#form_#{number}\").my_method();"
  end.join("\n")
end

而 Haml 将会是这样

:javascript
    #{create_js([1,2,3])}

感谢您的详细解释!很有效,但是我无法在Ruby 1.9.3上使用.join("\n")技巧(上面的函数只返回arr的内容)。 - bevanb
@bevanb 注意,我将 each 更改为 map 并添加了 join;你也更改了吗?否则,你看到了什么?(我正在使用1.9.3版本,它对我有效)。 - matt
啊,我错过了从 eachmap 的更改,谢谢你指出来。 - bevanb

0

你的 JavaScript 中有 Ruby 语法,这显然是行不通的。你可以使用像 underscore.js 这样的库,并像这样迭代你的数组:

_.each([1, 2, 3], function(number){
    $("#form_" + number).my_method();
});

试试看。

或者你可以使用jQuery的each方法:

$.each([1, 2, 3], function(i, number){
     $("#form_" + number).my_method();
});

或者,如果$()表示jQuery,则$.each([1,2,3],function(i, number) {... - nnnnnn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接