2012-05-30 4 views
3

Чтобы сказать правду, я могу вызвать функцию, но просто жестко. Вместо жесткого кодирования submit, связывающий мою функцию getData, я хотел бы вызвать функцию аргументами. Пожалуйста, помогите мне, как это сделать.Как вызвать функцию-экземпляр класса в javascript?

Спасибо.

formhandler = new xForm.Main(); // new formhandler 
formhandler.setForm(this.formid); // fn.setForm(string) // configure the container, which has the form elements, or the form itself 
modal = new xModal.Main(); // new modal handler 
modal.setModal(this.modalid); // set modal element 
modal.showModal(); // show 
modal.bindClose(".cancel"); // bind closing classes 
modal.bindSubmit(".submit", formhandler, "getData"); // bind submit to call formhandler.getData() 

в xModal.js

var xModal = xModal || {}; 

xModal.Main = function() 
{ 
    var self = this; 
    ... 

this.bindSubmit = function(classname, a, b) 
{ 
    this.closeclass = classname; 
    $("#"+this.target).find(classname).click(function(){ 
     a.call(b); // edited after the original post, i forgot to replace the call's argument to b in the question excuse me for the inaccuracy 
    }); 
} 

эта функция должна вызывать GetData в XFORM (вот фрагмент из XFORM)

var xForm = xForm || {}; 

xForm.Main = function() 
{ 
var self = this; 
this.target = ""; 
this.data = {}; 

... 

this.getData = function() 
{ 
    getSingleElements(); 
    getMultiElements(); 
    return returnData(); 
} 

Обновление:

Я думаю, что я только что нашел способ сделать это, но, пожалуйста, скажите мне, если я сделал что-то не так, или у вас есть лучшее решение для этой проблемы (я уверен, что у кого-то есть)

Я думаю, у меня есть правильный метод.

в XFORM я сделал сноска, которая вызывает функции по параметрам содержит в себе (что равно это, на самом деле)

var xForm = xForm || {}; 

xForm.Main = function() 
{ 
var self = this; 

this.callFn = function(func) 
{ 
    return self[func].call(this); 
} 

... 

тогда я называю ФН из другого класса (xModal)

var xModal = xModal || {}; 

xModal.Main = function() 
{ 
var self = this; 
this.bindSubmit = function(classname, a, b) 
{ 
    this.closeclass = classname; 
    $("#"+this.target).find(classname).click(function(){ 
     a.callFn(b); 
    }); 
} 

тогда я просто должен сказать xModal это:

modal.bindSubmit(".submit", formhandler, "getData"); // bind submit to call formhandler.getData() 

так что теперь модальное гр lass вызовет функцию args [1] args [2]. также может дать больше параметров вызову fn методом apply.

работает отлично, но я не знаю, может быть, вы можете помочь мне сделать это лучше.

ответ

1

Вы связываете имя метода определенного объекта к представить события:

modal.bindSubmit(".submit", formhandler, "getData"); 

Но вы хотите, чтобы передать аргументы метода, а также. Это не способ Javascript. Вместо этого, просто привязать анонимную функцию к событию, и вызвать метод, как вам нравится внутри этой анонимной функции:

modal.bindSubmit(".submit", function(){ 
    formhandler.getData("My arguments"); 
}); 

То, что вы видите в моем примере это анонимная функция, переданная в качестве аргумента. В Javascript нет никакого различия между значением, например, строкой или целым числом, и функцией. Функция может быть назначена переменной и передана в качестве аргумента.

Чтобы сделать его более ясным, вы также можете написать это так:

var eventHandler = function(){ 
    formhandler.getData("My arguments"); 
}; 

modal.bindSubmit(".submit", eventHandler); 

Это называется «первый класс» функции, и являются частью «функционального программирования» парадигмы.

Внутри функции обработчика событий у вас все еще есть доступ к переменным в scooe, в котором он был создан, например объект formhandler. Это называется «закрытием».

Читайте об этом. Сначала это затмит ваш ум, но это действительно стоит вашего времени, так как оно откроет вам глаза на гораздо более простые решения.

Из вашего примера, я не уверен, что такое модальный объект. Если это элемент jQuery, мой пример должен работать сразу, в противном случае вам нужно будет обновить свой код, чтобы вызвать функцию, переданную как обработчик события, вместо вызова метода на объект.

+0

Я этого не понимаю, извините. :(Пожалуйста, объясните это. –

+0

@ Répás: Я обновил свой ответ, чтобы объяснить, что делает код. Протестируйте его и примите мой ответ, если он сработает для вас. – geon

Смежные вопросы