【问题标题】: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 如果没有明确给出接收者”我应该在上面写的。

标签: javascript jquery ruby coffeescript metaprogramming


【解决方案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]();
      

      【讨论】:

        猜你喜欢
        • 2018-11-09
        • 2018-04-09
        • 1970-01-01
        • 1970-01-01
        • 2021-11-09
        • 1970-01-01
        • 2011-12-22
        • 2011-02-18
        • 2014-08-18
        相关资源
        最近更新 更多