0

私は、Backboneのイベントシステムを次のようなオブジェクトでエミュレートしています。

var events = {
    'click .one': 'fnOne',
    'click .two': 'fnTwo',
    'click .three': 'fnThree'
}

次に、jqueryでイベントリスナーを設定するために、次を使用しています。

var method,
    match,
    event_name,
    selector;

var scope = {
     // Complex object literal passed to the event's
     // function for access...
};

var delegateEventSplitter = /^(\S+)\s*(.*)$/;
for (key in events) {
    if (events.hasOwnProperty(key)) {
        method = events[key];
        match = key.match(delegateEventSplitter);
        event_name = match[1];
        selector = match[2];

        $('#element').on(event_name,selector,function(event){ 
            method(event,scope);
        });
     }
}

私が抱えている問題は、すべてのイベントが最後の関数を起動することを除いて、正しくバインドされていることですfnThree

4

2 に答える 2

3

単なるクロージャ/ループの問題。クロージャは字句名のみをバインドし、その時点の値はバインドしません。

値をキャプチャするための私のお気に入りの方法の1つは次のwithとおりです。

for (key in events) {
    if (events.hasOwnProperty(key)) {
        method = events[key];
        match = key.match(delegateEventSplitter);
        event_name = match[1];
        selector = match[2];

        with ({method:method})
        {
            $('#element').on(event_name,selector,function(event){ 
               method(event,scope);
            });
        }
    }
}

しかし、これにより、ダグラス・クロックフォードの一部の侍者が心臓発作で死亡するため、次のこともできます。

            (function(method) { $('#element').on(event_name,selector,function(event){ 
               method(event,scope);
            }); })(method);

どちらが好ましいかをあなたに決めさせます。

于 2013-01-30T22:36:37.687 に答える
1

を使用してみてください$.each()。関数の引数は、各反復で便利にクロージャを形成します。

$.each(events, function(key, method) {
    var match = key.match(delegateEventSplitter);
    $('#element').on(match[1], match[2], function(event){ 
        method(event, scope);
    });
});
于 2013-01-30T22:37:26.190 に答える