Ruby的发送中是否有Javascript / Coffeescript / jQuery中的等价物?

时间:2013-07-23 08:20:42

标签: javascript jquery ruby coffeescript metaprogramming

如果我在字符串中有方法名称,在Ruby中我可以使用send动态分派方法,例如

method_name = "delete"
send method_name

我也可以利用插值:

method_name = "add"
send "#{method_name}_task", args

我在javascript中定义了2个函数,一个用于删除,一个用于更新内容。每个按钮都是动态添加的,此时只需通过button.on "click"绑定删除方法,例如

b.on "click", (event) ->
  event.preventDefault() # stop submission via postback
  this_button = $(this)
  task_id = this_button.data("task-id")
  delete_task( task_id, this_button )
  false

我希望能够做到这一点:

method_name = "delete"
b.on "click", (event) ->
  event.preventDefault() # stop submission via postback
  this_button = $(this)
  task_id = this_button.data("task-id")
  send "#{method_name}_task", task_id, this_button
  false

两个函数的绑定之间的唯一区别是这一行。如果有一个明显的方法,减少重复是有帮助的。我的搜索中没有找到任何内容,所以如果有人能提供帮助,我将非常感激。

3 个答案:

答案 0 :(得分:10)

method_name = "delete"
obj.send method_name

在Javascript中看起来会像这样:

methodName = "delete";
obj[methodName]();

你总是需要obj,所以如果ruby send method_nameself.send method_name相同,那么你可以使用this[methodName]()

答案 1 :(得分:7)

您需要使用bracket notation

 b.on("click", window[method_name](event))

答案 2 :(得分:2)

如果您的方法是在全球范围内定义的,例如

function func_delete(arg1, arg2) {
    // ...
}

只需使用方括号表示法:

var method_name = "func_delete";
window[method_name](arg1, arg2);

否则,您可以以相同的方式使用自定义对象属性:

var methods = {
    func_delete: function() { ... }
};

methods[method_name]();