LogicMachine Forum
Remove grp.listener - Printable Version

+- LogicMachine Forum (https://forum.logicmachine.net)
+-- Forum: LogicMachine eco-system (https://forum.logicmachine.net/forumdisplay.php?fid=1)
+--- Forum: OLD visualization (https://forum.logicmachine.net/forumdisplay.php?fid=9)
+--- Thread: Remove grp.listener (/showthread.php?tid=4628)



Remove grp.listener - DGrandes - 07.03.2023

Hi,

I´m doing a widget with dynamic object address and I need to remove listeners when I close widget or when I open it again with another address.

Code:
  // Declare vars   var ObjEscucha = "0/0/0";   var MainObjectSplitted = [];   var DirOriginales = ["8/1/102","8/1/103"];   var DirWrNuevas = ["1/1/1","1/1/2"];   var DirWrSustituidas = []   var DirEstadosReales = [["0/2/0","0/2/1"],["0/3/1","0/3/2"]]   var DirEstSustituidas = [["Es la 0/2/0","Es la 0/2/1"],["H","ADIOS"]]     function actualizarEstados(a,b) {     return function (obj) {       console.log(DirEstSustituidas[a][b])     };   }     function removelistener(src) {    var el = $(src) // source element reference      , addr = el.data('status-object') // group address of status object      , id = Scada.encodeGroupAddress(addr) // address to id      , obj = objectStore.objects[ id ]; // get object's store reference     if (obj) {      // find listener that is attached to the source element     console.log(addr)      $.each(obj.listeners, function(index, listener) {        // remove the listener        if (listener.bind.el && el.is(listener.bind.el)) {          obj.listeners.splice(index, 1);        }      });    }   }     // Detect adresses linked to widget button and create arrays   $(".screen_widget").on("click", function(e) {     ObjEscucha = $(this).data("object");         for (var i = 0; i < DirOriginales.length; i++) {                 if (ObjEscucha == DirOriginales[i]){                    DirWrSustituidas = DirWrNuevas[i]                                     //I NEED TO REMOVE THIS LISTENER WHEN I OPEN AGAIN THE WIDGET                   for (var j = 0; j < DirEstadosReales[i].length; j++) {                     grp.listen(DirEstadosReales[i][j], actualizarEstados(i,j));                   }                 }         }      });    

How can i do that?

Thanks!


RE: Remove grp.listener - admin - 07.03.2023

Same arguments as for grp.listen:
Code:
function removelistenerfn(addr, fn) {   var id = Scada.encodeGroupAddress(addr);   var listeners = objectStore.listeners[ id ] || [];   $.each(listeners, function(index, listener) {     if (listener.fn == fn) {       listeners.splice(index, 1);     }   }); }



RE: Remove grp.listener - DGrandes - 07.03.2023

(07.03.2023, 10:57)admin Wrote: Same arguments as for grp.listen:
Code:
function removelistenerfn(addr, fn) {   var id = Scada.encodeGroupAddress(addr);   var listeners = objectStore.listeners[ id ] || [];   $.each(listeners, function(index, listener) {     if (listener.fn == fn) {       listeners.splice(index, 1);     }   }); }

And what do i have to put in "fn". When I close the widget I need to remove the listener that I´ve created when I open it.

Thanks


RE: Remove grp.listener - admin - 07.03.2023

Same as for grp.listen. First argument is the group address, second argument is the callback function.


RE: Remove grp.listener - DGrandes - 07.03.2023

(07.03.2023, 11:40)admin Wrote: Same as for grp.listen. First argument is the group address, second argument is the callback function.

I´ve done that but it doesn´t work

callback function is " actualizarEstados(i,j) " and addreses are in the array "DirEstadosReales[i][j]"
Code:
  // Detect adresses linked to widget button and create arrays   $(".screen_widget").on("click", function(e) {     removelistenerfn("0/2/1")     ObjEscucha = $(this).data("object");         for (var i = 0; i < DirOriginales.length; i++) {                 //REMOVE LISTENERS                 for (var j = 0; j < DirEstadosReales[i].length; j++) {                   //console.log(DirEstadosReales[i][j])                   removelistenerfn(DirEstadosReales[i][j],actualizarEstados(i,j))                 }                          if (ObjEscucha == DirOriginales[i]){                    DirWrSustituidas = DirWrNuevas[i]                                     //I NEED TO REMOVE THIS LISTENER WHEN I OPEN AGAIN THE WIDGET                   for (var j = 0; j < DirEstadosReales[i].length; j++) {                     grp.listen(DirEstadosReales[i][j], actualizarEstados(i,j));                   }                 }         }      });



RE: Remove grp.listener - admin - 07.03.2023

This won't work because each time you call actualizarEstados a new function is created.
If you don't have any other code modifying the listeners array you can simply remove the last listener that has been registered like this:
Code:
function removelistenerlast(addr) {   var id = Scada.encodeGroupAddress(addr);   var listeners = objectStore.listeners[ id ] || [];   listeners.pop(); }



RE: Remove grp.listener - DGrandes - 07.03.2023

(07.03.2023, 12:03)admin Wrote: This won't work because each time you call actualizarEstados a new function is created.
If you don't have any other code modifying the listeners array you can simply remove the last listener that has been registered like this:
Code:
function removelistenerlast(addr) {   var id = Scada.encodeGroupAddress(addr);   var listeners = objectStore.listeners[ id ] || [];   listeners.pop(); }

Ok thanks!