11

文字列にメソッド名がある場合、Ruby ではsendメソッドを動的にディスパッチするために使用できます。

method_name = "delete"
send method_name

補間も利用できます。

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

私はjavascriptで定義された2つの関数を持っています。1つは削除し、もう1つは何かを更新します。それぞれのボタンが動的に追加され、現時点では、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

2 つの関数のバインディングの唯一の違いは、この 1 行です。明らかな方法があれば、繰り返しを減らすとよいでしょう。検索しても何も見つからなかったので、誰か助けていただければ幸いです。

4

3 に答える 3

11
method_name = "delete"
obj.send method_name

Javascript では次のようになります。

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

ただし、常に必要なobjので、ルビーsend 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 に答える