2013-07-23 10 views
9

文字列にメソッド名がある場合、Rubyではsendを使用してメソッドを動的にディスパッチできます。Javascript/Coffeescript/jQueryにRubyの送信と同等の機能はありますか?

method_name = "delete" 
send method_name 

私も補間を利用することができます。

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

私が何かを更新するために、JavaScriptで定義された2つの機能、削除する1、1をしました。それぞれのボタンは動的に追加され、現時点では削除メソッドだけが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行です。明らかな方法がある場合は、繰り返しを減らすと便利です。私は検索で何も見つけていないので、誰かが助けてくれればそれは大いに感謝するだろう。

+0

あなたはcoffeescriptコードで何を送っていますか?あなたは 'obj'を持っています。 – Esailija

+0

@Esailija申し訳ありませんが、それが明確でない場合は、私はJavaScriptでオブジェクトを使用していません。 Rubyは自動的に自己を使用します。つまり、この例ではオブジェクトは必要ありません。私はそれがより明確になると考えました。私はそれを変更します、ありがとう。 – iain

+0

"Rubyは自動的にself _ifを使用します。受信者が明示的に指定されていません。" – iain

答えて

7

あなたはbracket notation

b.on("click", window[method_name](event)) 
を使用する必要があります
2

メソッドがグローバルスコープで定義されている場合(例:

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

ちょうど角括弧表記を使用します。

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

そうでない場合は、同じ方法でカスタムオブジェクトのプロパティを使用することがあります。

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

methods[method_name](); 
10
ルビー send method_nameself.send method_nameと同じである場合、あなたは this[methodName]()を使用することができますので、あなたは常に、しかし objが必要

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

:それはJavascriptで、このようになりますように

が見えます。

関連する問題