3

本当のことを言うと、私は関数を呼び出すことができますが、ハードコーディングされた方法でのみです。getData 関数をバインドするサブミットをハードコーディングする代わりに、引数で関数を呼び出したいと思います。これを行う方法を教えてください。

ありがとう。

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
    });
}

この関数は、xForm で getData を呼び出す必要があります (xForm のスニペットを次に示します)。

var xForm = xForm || {};

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

...

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

アップデート:

これを行う方法を見つけたばかりだと思いますが、何かを間違って作成したかどうか、またはこの問題のより良い解決策があるかどうか教えてください(誰かが持っていると確信しています)

私は正しい方法を持っていると思います。

xFormで、パラメータによって関数を呼び出すfnを作成しました(実際には、これと同じです)

var xForm = xForm || {};

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

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

...

次に、別のクラス (xModal) から fn を呼び出します。

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()

そのため、モーダル クラスは args[1] の args[2] 関数を呼び出します。また、apply メソッドによって呼び出し fn にさらにパラメーターを与えることもできます。

私には問題なく機能しますが、わかりません。これを改善するのを手伝ってくれるかもしれません。

4

1 に答える 1

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);

これは「第一級関数」と呼ばれ、「関数型プログラミング」パラダイムの一部です。

イベント ハンドラー関数内では、formhandler オブジェクトのように、それが作成された scooe 内の変数に引き続きアクセスできます。これを「閉鎖」と呼びます。

これを読んでください。最初は頭がおかしくなるかもしれませんが、もっと簡単な解決策に目を向けることができるので、時間をかけるだけの価値があります。

あなたの例から、オブジェクトモーダルが何であるかわかりません。それが jQuery 要素である場合、私の例はすぐに機能するはずです。そうでない場合は、オブジェクトのメソッドを呼び出す代わりに、イベント ハンドラーとして渡された関数を呼び出すようにコードを更新する必要があります。

于 2012-05-30T10:21:41.910 に答える