2013-07-23 26 views
9

Nếu tôi có tên phương thức trong một chuỗi, trong Ruby tôi có thể sử dụng send để tự động gửi các phương thức, ví dụ:Có tương đương trong Javascript/Coffeescript/jQuery với gửi của Ruby không?

method_name = "delete" 
send method_name 

tôi có thể tận dụng lợi thế của suy quá:

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

Tôi đã 2 chức năng quy định tại javascript, một để xóa, một để cập nhật cái gì đó. Mỗi nút được thêm động và vào lúc này, chỉ cần phương thức xóa bị ràng buộc qua button.on "click", ví dụ:

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 

Tôi muốn để có thể làm điều này:

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 

Sự khác biệt duy nhất giữa các ràng buộc của 2 chức năng là một trong những dòng này. Nếu có một cách rõ ràng, nó sẽ rất hữu ích để cắt giảm sự lặp lại. Tôi đã không tìm thấy bất cứ điều gì trong tìm kiếm của tôi, vì vậy nếu có ai có thể giúp nó sẽ được nhiều đánh giá cao.

+0

Bạn gửi gì vào mã coffeescript? trong các ví dụ ruby ​​bạn có 'obj'. – Esailija

+0

@Esailija Xin lỗi nếu điều đó không rõ ràng, tôi không sử dụng một đối tượng trong javascript. Ruby tự động sử dụng tự nó, vì vậy không có đối tượng cần thiết trong ví dụ này, tôi chỉ nghĩ rằng nó sẽ rõ ràng hơn. Tôi sẽ thay đổi nó, cảm ơn. – iain

+0

"Ruby tự động sử dụng tự _if không nhận được rõ ràng given_" Tôi nên đã viết ở trên. – iain

Trả lời

2

Nếu phương pháp của bạn được xác định trong phạm vi toàn cầu, ví dụ:

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

chỉ cần sử dụng dấu ngoặc vuông ký hiệu:

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

Nếu không, bạn có thể sử dụng thuộc tính đối tượng tùy chỉnh trong cùng một cách:

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

methods[method_name](); 
10
method_name = "delete" 
obj.send method_name 

Hình như nó sẽ là như thế này trong Javascript:

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

Bạn luôn cần obj mặc dù, vì vậy nếu trong ruby ​​send method_name là giống như self.send method_name, sau đó bạn có thể sử dụng this[methodName]().

Các vấn đề liên quan