Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Javascript Problem mit Event in Klasse

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Javascript Problem mit Event in Klasse

    This topic has been deleted. Only users with topic management privileges can see it.
    • E
      Eppertshäuser last edited by Eppertshäuser

      Hallo liebe Community

      da ich als C# Entwickler leider noch nicht so die Erfahrung mit Javascript habe, stehe ich leider vor folgendem Problem:

      Bei uns im haus werden die Leuchten alle über den Conbee II gesteuert. Daher möchte ich in Javascript eine Klasse anlegen, welche für die Steuerung der Leuchtengruppen (z.B. Wohnzimmer, Esszimmer, usw..) zustandig ist. Als Methoden besitz diese Klasse z.B. .SwitchOn(), .SwitchOff(), DimmDown(), usw... Per String wird der Ordnername der Datenpunkte übergeben, sodass je nach Konfiguration in der jeweiligen Instanz die Datenpunkte der Leuchtengruppe gesteuert werden.
      So weit so gut. Sie wie hier als Besipiel:

      var wcLightControl = new AutomaticLightGroupControl('deconz.0.Groups.18');
      wcLightControl.AutoMode(false);
      wcLightControl.AutoOff(3000);
      on({id: 'deconz.0.Sensors.6.buttonevent.1.press', change: 'any'}, wcLightControl.SwitchOn );
      on({id: 'deconz.0.Sensors.6.buttonevent.4.press', change: 'any'}, wcLightControl.SwitchOff );
      

      Klappt soweit auch erst mal ganz gut.

      Wenn das Event des Tasters

      on({id: 'deconz.0.Sensors.6.buttonevent.1.press', change: 'any'}, wcLightControl.SwitchOn );
      

      kommt, wird die Methode

      // Switch on the lightgroup
      SwitchOn()
      {
          log("Switch lights ON");
      
          this.Test();
      }
      

      in der instanz Aufgerufen. Das klappt auch noch.
      Wenn nun aber die Methode "this.Test" aufgerufen wird, erscheint folgende Fehlermeldung

      Logeintrag.png

      mit dem Hinweis, die Methode Test ist keine Funktion.
      In this.Test steht aktuell nur:

      Test()
          {
              log("Test aufgerufen!");
          }
      

      Jemand eine Idee? 😕

      Viele Grüße!

      mickym AlCalzone 2 Replies Last reply Reply Quote 0
      • mickym
        mickym Most Active @Eppertshäuser last edited by

        @eppertshäuser Ich denke, dass Du mit dieser on (on(pattern, callbackOrId, value) ) ja kein Objekt übergibst, auch wenn die Funktion in der Instanz Deines Objektes sich befindet, auf das Du mit this referenzierst, sondern diese Callback Funktion wird ja von dem Eventhandler on(... aufgerufen. Dem Eventhandler ist es aber egal, ob er eine Callbackfunktion innerhalb eines Objektes oder eine globale Funktion aufruft - er übergibt dieser Funktion das entsprechende iobroker-Objekt und kein JS-Objekt.

        Aber ggf. kann Dir @paul53 Dir das besser erläutern. So ist jedenfalls nach meinem Verständnis.

        1 Reply Last reply Reply Quote 0
        • AlCalzone
          AlCalzone Developer @Eppertshäuser last edited by AlCalzone

          @eppertshäuser Am besten liest du dir das mal durch:
          https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Operators/this
          bzw.
          https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Functions/Arrow_functions

          Die Übergabe der Instanzfunktion hier:

          on({id: 'deconz.0.Sensors.6.buttonevent.1.press', change: 'any'}, wcLightControl.SwitchOn );
          

          sorgt dafür, dass die Funktion außerhalb des Kontext der Instanz aufgerufen wird. this verweist dann nicht auf die Klasseninstanz. Entweder musst du die Funktion vorm Übergeben an die Instanz binden:

          on({id: 'deconz.0.Sensors.6.buttonevent.1.press', change: 'any'}, wcLightControl.SwitchOn.bind(wcLightControl) );
          

          oder Pfeilfunktionen nutzen, um dieses Verhalten zu vermeiden:

          on({id: 'deconz.0.Sensors.6.buttonevent.1.press', change: 'any'}, (...args) => wcLightControl.SwitchOn(...args) );
          

          Statt ...args kannst du die Parameter auch explizit auflisten.

          E 1 Reply Last reply Reply Quote 0
          • E
            Eppertshäuser @AlCalzone last edited by

            @alcalzone Danke für den Tip. Damit klappt es nun! 👍 😊

            1 Reply Last reply Reply Quote 0
            • First post
              Last post

            Support us

            ioBroker
            Community Adapters
            Donate

            860
            Online

            31.8k
            Users

            80.0k
            Topics

            1.3m
            Posts

            javascript
            3
            4
            93
            Loading More Posts
            • Oldest to Newest
            • Newest to Oldest
            • Most Votes
            Reply
            • Reply as topic
            Log in to reply
            Community
            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
            The ioBroker Community 2014-2023
            logo