-1

共有エミッターの 1 つをリッスンする 1 つのリスナーのバインドを解除するという問題があります。

// this is emitter. Fire always in a.b.c namespace but with different parameters 
$(document).trigger("a.b.c", {
    p: 1,
    p2: ...

});

// listener 1
$(document).bind("a.b.c", function(e, object) {
    if (object.myParam) {
        ....
    }
});

// listener 2
$(document).bind("a.b.c", function(e, object) {
    if (object.anotherParam) {
        ....
    }
});

リスナー 2 のバインドを解除して、リスナー 1 が引き続き機能するようにする方法は?

4

2 に答える 2

1

後でできるように、ハンドラーへの参照を保存しますunbind

var listener = function(e, object) {
    if (object.anotherParam) {
        ....
    }
};


$(document).bind("a.b.c", listener);

// sometime later:
$(document).unbind("a.b.c", listener);
于 2012-10-11T08:42:00.497 に答える
0

より良い解決策を見つけましたNamespaced Events

// this is emitter. Fire always in a.b.c namespace but with different parameters 
$(document).trigger("a.b.c", {
    p: 1,
    p2: ...

});

// listener 1
$(document).bind("a.b.c.listener1", function(e, object) {
    if (object.myParam) {
        ....
    }
});

// listener 2
$(document).bind("a.b.c.listener2", function(e, object) {
    if (object.anotherParam) {
        ....
    }
});

これでトリガーは と でa.b.cトリガーされlistener1ますlistener2。バインドを解除するには、次のように特定のリスナーでバインドを解除します。

$(document).unbind("a.b.c.listener1");

その場合listener2、保持され、名前空間を介して呼び出すことができますa.b.c

于 2012-10-11T08:49:18.150 に答える