11

如果我在字符串中有一个方法名称,在 Ruby 中我可以send用来动态调度方法,例如

method_name = "delete"
send method_name

我也可以利用插值:

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

我在 javascript 中定义了 2 个函数,一个用于删除,一个用于更新某些内容。每个按钮都是动态添加的,目前,只有 delete 方法通过 绑定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

这两个函数的绑定之间的唯一区别是这一行。如果有明显的方法,减少重复会很有帮助。我在搜索中没有找到任何东西,所以如果有人可以提供帮助,将不胜感激。

4

3 回答 3

11
method_name = "delete"
obj.send method_name

看起来在 Javascript 中会是这样的:

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

你总是需要这个obj,所以如果在 rubysend method_name​​ 中与 相同self.send method_name,那么你可以使用this[methodName]().

于 2013-07-23T08:25:39.643 回答
9

您需要使用括号表示法

 b.on("click", window[method_name](event))
于 2013-07-23T08:25:35.067 回答
3

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

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

只需使用方括号表示法:

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

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

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

methods[method_name]();
于 2013-07-23T08:22:58.697 回答