0

私はこのコードのようなものを持っています:

        for (var i = 0; i < interactions.length; i++) {
            action = interactions[i].split(':');

            if (events.indexOf(action[0]) >= 0) {
                $(this).bind(action[0], function (e) {
                    if (action.length == 2) {
                        model[action[1]]();
                    }
                    else if (action.length == 3) {
                        var args = action[2].split('|');
                        model[action[1]].apply(null, args);
                    }
                });
            }
        }

変数「events」は、単に「click、dblclick」などのイベント名を含む文字列です。問題は、イベント内に入ると、「action」変数がコンテキストを失っていることです。これは、「アクション」がコンテキストにとどまる必要がある構造のような閉鎖のように見えますが、そうではありません。この例では、次のように 2 つの相互作用があります。

1) クリック:保存

2) 無効:SomeCustomFunction

そのため、クリック イベントを実行すると、action[1] が「保存」であることが期待されますが、実際には「無効」になっています。だから、それが最後に設定されたものと同じように、それが私が得たものです。

物事を文脈に保つ方法はありますか?

本当にありがとう、

4

1 に答える 1

0

イベント ハンドラーが実行されるまで (クリックまたは実際に発生したとき)は、ループactionの最後の反復での値と等しくなります。各反復で呼び出される関数のローカル変数であるfor場合必要なクロージャ構成が得られます。action

$.each()すでに jQuery を使用しているため、単純なループの代わりに使用するのが最も簡単な変更ですfor。したがって、各反復の処理を独自のクロージャーに入れますaction

   $.each(interactions, function(i, item) {
        var action = item.split(':');

        if (events.indexOf(action[0]) >= 0) {
            $(this).bind(action[0], function (e) {
                if (action.length == 2) {
                    model[action[1]]();
                }
                else if (action.length == 3) {
                    var args = action[2].split('|');
                    model[action[1]].apply(null, args);
                }
            });
        }
    });
于 2012-07-08T05:22:46.743 に答える