projectstorm / react-diagrams

a super simple, no-nonsense diagramming library written in react that just works
https://projectstorm.cloud/react-diagrams
MIT License
8.6k stars 1.17k forks source link

deregister listener #764

Closed tomosnam closed 3 years ago

tomosnam commented 3 years ago

Hi, I am registering the following event on each node: showWindow = (item) => { ondblclick = (event) => { ...
} } And my question is: How to deregister the event? I have tried the following and it doesn't work:

const nodes = this.state.diagramEngine.getModel().getNodes() nodes.forEach((node) => { let glh = node.getListenerHandle(this.showWindow) glh.deregisterListener() })

berabulut commented 3 years ago

I find these in source code. It may help.

registerListener(listener: L): ListenerHandle {
    const id = Toolkit.UID();
    this.listeners[id] = listener;
    return {
        id: id,
        listener: listener,
        deregister: () => {
            delete this.listeners[id];
        }
    };
}

deregisterListener(listener: L | ListenerHandle) {
    if (typeof listener === 'object') {
        (listener as ListenerHandle).deregister();
        return true;
    }
    const handle = this.getListenerHandle(listener);
    if (handle) {
        handle.deregister();
        return true;
    }
    return false;
}

I think instead of this let glh = node.getListenerHandle(this.showWindow) you need to deregister directly from node. Like this node.deregisterListener(listener: L | ListenerHandle)

tomosnam commented 3 years ago

OK, thank you.