Logic Machine Forum
Remove grp.listener - Printable Version

+- Logic Machine Forum (https://forum.logicmachine.net)
+-- Forum: LogicMachine eco-system (https://forum.logicmachine.net/forumdisplay.php?fid=1)
+--- Forum: 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!