Javascript/Coffeescript/jQuery 中是不是有与 Ruby 的发送等效的内容?

Posted

技术标签:

【中文标题】Javascript/Coffeescript/jQuery 中是不是有与 Ruby 的发送等效的内容?【英文标题】:Is there an equivalent in Javascript/Coffeescript/jQuery to Ruby's send?Javascript/Coffeescript/jQuery 中是否有与 Ruby 的发送等效的内容? 【发布时间】:2013-07-22 05:06:16 【问题描述】:

如果我在字符串中有方法名,在 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

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

【问题讨论】:

你在咖啡脚本代码中发送什么?在你有obj的红宝石示例中。 @Esailija 抱歉,如果不清楚,我没有在 javascript 中使用对象。 Ruby 自动使用 self 即 this,因此示例中不需要对象,我只是认为它会更清晰。我会改的,谢谢。 “Ruby 自动使用 self 如果没有明确给出接收者”我应该在上面写的。 【参考方案1】:
method_name = "delete"
obj.send method_name

在 Javascript 中看起来应该是这样的:

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

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

【讨论】:

【参考方案2】:

您需要使用bracket notation

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

【讨论】:

【参考方案3】:

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

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

只需使用方括号表示法:

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

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

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

methods[method_name]();

【讨论】:

以上是关于Javascript/Coffeescript/jQuery 中是不是有与 Ruby 的发送等效的内容?的主要内容,如果未能解决你的问题,请参考以下文章