Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. [SOLVED] Auf Änderung eines Klassen Attributs reagieren?

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    2.5k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    991

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.3k

[SOLVED] Auf Änderung eines Klassen Attributs reagieren?

Geplant Angeheftet Gesperrt Verschoben JavaScript
javascriptmonitoring
13 Beiträge 3 Kommentatoren 792 Aufrufe 3 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • iPhilBlnI iPhilBln

    Hej,
    ich bastel grade an einem Skript welches verschiedene Klassen beinhaltet, die von einer übergeordneten Klasse erben sollen.
    Ich stehe aktuell vor dem Problem, dass wenn ein Attribut durch eine Methode der übergeordneten Klasse geändert wird, ich darauf in der untergeordneten Klasse reagieren möchte. Wie setzt man denn sowas am Besten um, ohne die Methode neu definieren zu müssen?

    'use strict';
    
    const eventListener = new Event('test');
    
    class Name{
        constructor(name){
            this.name = name;     
        }
    
        setName(name){
            this.name = name;
        }
    }
    
    class Surname extends Name{
        constructor(name){
    
            super(name);
            this.surname = undefined;
    
            this.name.addEventListener('test', val => {
                val === 'Max' ? this.surname = 'Mustermann' : this.surname = undefined;
    
                console.log(`Vorname: ${this.name} Nachname: ${this.surname}`);
            });
        }
    }
    
    const person = new Surname('Max');
    
    person.setName('Paul');
    

    Mit dem Beispiel erhalte ich nur folgende Fehlermeldung:

    info: javascript.0 (240790) script.js.testskripte.eventListener: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions
    error: javascript.0 (240790) script.js.testskripte.eventListener: ReferenceError: Event is not defined
    error: javascript.0 (240790)     at script.js.testskripte.eventListener:3:23
    error: javascript.0 (240790)     at script.js.testskripte.eventListener:33:3
    
    OliverIOO Offline
    OliverIOO Offline
    OliverIO
    schrieb am zuletzt editiert von OliverIO
    #4

    @iphilbln

    da stimmen ein paar sachen nicht in deinem code.
    ich gehe davon aus, das du das Event-System von node meinst?
    Schau dir mal das Beispiel hier an
    https://www.w3schools.com/nodejs/nodejs_events.asp
    das ist ein wenig verständlicher wie das in der node doku selbst.

    Im Prinzip fügst du deiner Klasse ein eventEmitter-Objekt hinzu.
    Mit dem kannst du bei Änderung eines Attributs ein Event mit dem emit-Befehl erzeugen.

    Jemand der deine Klasse verwendet, der kann dann bspw mit dem Befehl xxx.on("eventname",Funktionsbaustein) darauf reagieren.

    und hier 2 Beispielcodes wie man das in eine Klasse einbaut.
    Einmal über Vererbung und einmal über Komposition.
    https://stackoverflow.com/questions/59100598/how-do-i-add-custom-events-to-classes-in-node

    Nachtrag: Falls du iobroker hier nur zum lernen verwendest, dann lad dir lieber visual code runter.
    der bietet die viel mehr support, was das debuggen angeht und ist kostenlos
    https://code.visualstudio.com/

    Meine Adapter und Widgets
    TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
    Links im Profil

    iPhilBlnI 1 Antwort Letzte Antwort
    1
    • iPhilBlnI iPhilBln

      @codierknecht hmm ne das hab ich nicht vor. Dann wäre klar, dass ich die Methode komplett neu definieren müsste.
      In meinem Skript gibt es eigentlich eine Methode die für alle Klassen gleich ein Attribut setzt. Wenn sich dieses Attribut ändert, soll in der erbenden Klasse eine Methode aufgerufen werden, die sich dann aber unterscheidet. Hoffe das war verständlich?

      Jep genau, es soll am Ende nur Instanzen der abgeleiteten Klassen geben.

      CodierknechtC Offline
      CodierknechtC Offline
      Codierknecht
      Developer Most Active
      schrieb am zuletzt editiert von
      #5

      @iphilbln sagte in Auf Änderung eines Klassen Attributs reagieren?:

      @codierknecht hmm ne das hab ich nicht vor. Dann wäre klar, dass ich die Methode komplett neu definieren müsste.
      In meinem Skript gibt es eigentlich eine Methode die für alle Klassen gleich ein Attribut setzt. Wenn sich dieses Attribut ändert, soll in der erbenden Klasse eine Methode aufgerufen werden, die sich dann aber unterscheidet. Hoffe das war verständlich?

      Eine Basisklasse sollte von ihren Nachfahren völlig unabhängig sein.
      Besondere Verhaltensweisen werden ausschließlich in den abgeleiteten Klassen definiert.
      Also wird - zumindest in "meiner" Sprache - in den abgeleiteten Klassen der Setter für die Attribute (Member) überschrieben.
      Der Setter wird in der Basisklasse als "abstract" definiert - damit muss er in den Nachfahren implementiert werden.
      Und so kann das halt in jeder Klasse anders geregelt werden.

      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

      Proxmox 9.1.1 LXC|8 GB|Core i7-6700
      HmIP|ZigBee|Tasmota|Unifi
      Zabbix Certified Specialist
      Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

      iPhilBlnI 1 Antwort Letzte Antwort
      0
      • OliverIOO OliverIO

        @iphilbln

        da stimmen ein paar sachen nicht in deinem code.
        ich gehe davon aus, das du das Event-System von node meinst?
        Schau dir mal das Beispiel hier an
        https://www.w3schools.com/nodejs/nodejs_events.asp
        das ist ein wenig verständlicher wie das in der node doku selbst.

        Im Prinzip fügst du deiner Klasse ein eventEmitter-Objekt hinzu.
        Mit dem kannst du bei Änderung eines Attributs ein Event mit dem emit-Befehl erzeugen.

        Jemand der deine Klasse verwendet, der kann dann bspw mit dem Befehl xxx.on("eventname",Funktionsbaustein) darauf reagieren.

        und hier 2 Beispielcodes wie man das in eine Klasse einbaut.
        Einmal über Vererbung und einmal über Komposition.
        https://stackoverflow.com/questions/59100598/how-do-i-add-custom-events-to-classes-in-node

        Nachtrag: Falls du iobroker hier nur zum lernen verwendest, dann lad dir lieber visual code runter.
        der bietet die viel mehr support, was das debuggen angeht und ist kostenlos
        https://code.visualstudio.com/

        iPhilBlnI Offline
        iPhilBlnI Offline
        iPhilBln
        schrieb am zuletzt editiert von
        #6

        @oliverio Danke, das war genau das was ich gesucht habe.
        Hab mir jetzt mal fix mein Beispiel umgeschrieben:

        'use strict';
        
        const events = require('events');
        
        
        class Name{
            constructor(name){
                this.name = name;
                
                this.listener = new events.EventEmitter();
            }
        
            setName(name){
                this.name = name;
                this.listener.emit('name', this.name);
            }
        }
        
        class Surname extends Name{
            constructor(name){
        
                super(name);
                this.surname = undefined;
        
                this.listener.on('name', this.setSurname );
            }
        
            setSurname(surname) {
                surname === 'Max' ? this.surname = 'Mustermann' : this.surname = undefined;
        
                console.log(`Vorname: ${this.name} Nachname: ${this.surname}`);
            }
        }
        
        const person = new Surname('Max');
        
        person.setName('Paul');
        
        setTimeout(() => {
            person.setName('Max');
        }, 2 * 1000);
        

        Läuft soweit erstmal, sehe aber grade noch deinen Nachtrag mit den Beispielen auf Stackoverflow. Werde ich mir später mal in Ruhe anschauen.

        Und ich schreibe meine Skripte mit VS Code. Javascript ist aber noch recht neu für mich, beginne nur so langsam meine Blockly Skripte zu optimieren und direkt mit JS zu schreiben.

        1 Antwort Letzte Antwort
        0
        • CodierknechtC Codierknecht

          @iphilbln sagte in Auf Änderung eines Klassen Attributs reagieren?:

          @codierknecht hmm ne das hab ich nicht vor. Dann wäre klar, dass ich die Methode komplett neu definieren müsste.
          In meinem Skript gibt es eigentlich eine Methode die für alle Klassen gleich ein Attribut setzt. Wenn sich dieses Attribut ändert, soll in der erbenden Klasse eine Methode aufgerufen werden, die sich dann aber unterscheidet. Hoffe das war verständlich?

          Eine Basisklasse sollte von ihren Nachfahren völlig unabhängig sein.
          Besondere Verhaltensweisen werden ausschließlich in den abgeleiteten Klassen definiert.
          Also wird - zumindest in "meiner" Sprache - in den abgeleiteten Klassen der Setter für die Attribute (Member) überschrieben.
          Der Setter wird in der Basisklasse als "abstract" definiert - damit muss er in den Nachfahren implementiert werden.
          Und so kann das halt in jeder Klasse anders geregelt werden.

          iPhilBlnI Offline
          iPhilBlnI Offline
          iPhilBln
          schrieb am zuletzt editiert von
          #7

          @codierknecht du spielst eher auf Java an oder? So wie ich das verstanden habe, funktioniert das bei Javascript mit Klassen im Großen und Ganzen anders als bei Java. Das Attribut der übergeordneten Klasse soll durch die erbende Klasse auch in keinster Weise beinflusst werden oder ähnliches, es soll nur auf die Änderung reagiert werden.
          Das was @OliverIO geschrieben hat, ist schon das was ich suche.

          OliverIOO 1 Antwort Letzte Antwort
          0
          • iPhilBlnI iPhilBln

            @codierknecht du spielst eher auf Java an oder? So wie ich das verstanden habe, funktioniert das bei Javascript mit Klassen im Großen und Ganzen anders als bei Java. Das Attribut der übergeordneten Klasse soll durch die erbende Klasse auch in keinster Weise beinflusst werden oder ähnliches, es soll nur auf die Änderung reagiert werden.
            Das was @OliverIO geschrieben hat, ist schon das was ich suche.

            OliverIOO Offline
            OliverIOO Offline
            OliverIO
            schrieb am zuletzt editiert von OliverIO
            #8

            @iphilbln
            ne da hat @Codierknecht schon recht.
            Die Regeln der Objektorientierung gelten für alle Programmiersprachen.
            Aber in der praktischen Umsetzung muss das jeder selber lernen und durch Fehler auch erfahren wo das Problem liegt.
            Deine beiden Klassen machen für mich auch nicht soviel Sinn, bzw würde ich auf so einem Detaillevel keine separaten Klassen machen, da die wiederverwendung hier nicht so groß´ist (also name könntest dann bei surename prename midname evtl noch additional names verwenden, wenn du eine klammerklasse evtl namens person oder contact hast.
            den zusätzlichen code, den eine separate klasse benötigst, kannst du dir sparen, da du die umsetzung der Unterschiede direkt in einer Klammerklasse umsetzen kannst.
            da hast du dann auch mehrere Attribute, mit dem du dann auf eine Änderung mit einem Event reagieren kannst.

            darüber hinaus doppelst du in deinem beispiel die daten.
            Am Ende ist der surname einmal in der variable surename und auch in name der basisklasse gespeichert

            Meine Adapter und Widgets
            TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
            Links im Profil

            1 Antwort Letzte Antwort
            0
            • iPhilBlnI Offline
              iPhilBlnI Offline
              iPhilBln
              schrieb am zuletzt editiert von
              #9

              Ja das Beispiel soll eigentlich auch nur verdeutlichen wo es grade hapert, bei so wenig Attributen würde ich jetzt prinzipiell auch keine zwei Klassen erstellen. Im eigentlichen Skript existieren aber wesentlich mehr Methoden und Attribute. Daher war eigentlich die Idee eine Oberklasse zu schreiben und nur Methoden die nicht identisch sind dann in einer erbende Klasse zu definieren.
              @OliverIO Mir kommen aber bei deiner Antwort zwei Fragen auf.

                1. Was sind Klammerklassen?
                1. Wieso doppel ich meine Daten in dem Beispiel? Es existiert doch nur eine Instanz "Surname" in dem Beispiel.
              OliverIOO CodierknechtC 2 Antworten Letzte Antwort
              0
              • iPhilBlnI iPhilBln

                Ja das Beispiel soll eigentlich auch nur verdeutlichen wo es grade hapert, bei so wenig Attributen würde ich jetzt prinzipiell auch keine zwei Klassen erstellen. Im eigentlichen Skript existieren aber wesentlich mehr Methoden und Attribute. Daher war eigentlich die Idee eine Oberklasse zu schreiben und nur Methoden die nicht identisch sind dann in einer erbende Klasse zu definieren.
                @OliverIO Mir kommen aber bei deiner Antwort zwei Fragen auf.

                  1. Was sind Klammerklassen?
                  1. Wieso doppel ich meine Daten in dem Beispiel? Es existiert doch nur eine Instanz "Surname" in dem Beispiel.
                OliverIOO Offline
                OliverIOO Offline
                OliverIO
                schrieb am zuletzt editiert von
                #10

                @iphilbln

                klammerklassen ist meine umschreibung dafür das wenn du das so fortführen würdest, dann hättest du ganz viele unterklassen für eine person.. wie geschrieben das macht in diesem beispiel nicht so viel sinn.
                2)
                name hat das attribut name (Zeile 8)
                surname hat das attribut surname Zeile 23 und 29 (wobei 29 sogar nur eine blockvariable ist, die nach Aufruf von setSurname wieder vergessen wird.
                Wenn du die Klasse surename erzeugst (Zeile 35) dann wird natürlich auch die basisklassen mit erzeugt.(surename extends name zeile 19)
                der eine name wird durch den constructor belegt der andere durch eine methode. wie gesagt von der struktur ist das nicht alles so logisch. ich würde einfach das folgende machen

                /*jshint esversion: 8 */
                const events = require("events");
                class Person{
                    constructor(name,surname){
                
                        this.event = new events.EventEmitter();
                        this._name = name;
                        this._surename = surname;
                    }
                    set name(name) {
                        this._name=name;
                        this.event.emit("attributChanged","name",name);
                        this.event.emit("attributChangedName",name);
                     }
                    set surname(surname) {
                        this._surname=surname;
                        this.event.emit("attributChanged","surname",surname);
                        this.event.emit("attributChangedSurname",surname);
                    }
                    get name() {
                        return this._name;
                    }
                    get surname() {
                        return this._surname;
                    }
                }
                
                var p = new Person("aaa","bbb");
                p.event.on("attributChanged",(property,value)=>{
                    console.log(`${property} ${value}`);
                });
                
                p.name="ccc";
                

                Meine Adapter und Widgets
                TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                Links im Profil

                iPhilBlnI 1 Antwort Letzte Antwort
                0
                • iPhilBlnI iPhilBln

                  Ja das Beispiel soll eigentlich auch nur verdeutlichen wo es grade hapert, bei so wenig Attributen würde ich jetzt prinzipiell auch keine zwei Klassen erstellen. Im eigentlichen Skript existieren aber wesentlich mehr Methoden und Attribute. Daher war eigentlich die Idee eine Oberklasse zu schreiben und nur Methoden die nicht identisch sind dann in einer erbende Klasse zu definieren.
                  @OliverIO Mir kommen aber bei deiner Antwort zwei Fragen auf.

                    1. Was sind Klammerklassen?
                    1. Wieso doppel ich meine Daten in dem Beispiel? Es existiert doch nur eine Instanz "Surname" in dem Beispiel.
                  CodierknechtC Offline
                  CodierknechtC Offline
                  Codierknecht
                  Developer Most Active
                  schrieb am zuletzt editiert von
                  #11

                  @iphilbln sagte in Auf Änderung eines Klassen Attributs reagieren?:

                  du spielst eher auf Java an oder?

                  Java ist die dunkle Seite der Macht!
                  Nein, ich verwende in der Hauptsache Delphi. Wie @OliverIO schon schrieb: Die Regeln der Objektorientierung gelten prinzipiell für beliebige Sprachen.

                  Daher war eigentlich die Idee eine Oberklasse zu schreiben und nur Methoden die nicht identisch sind dann in einer erbende Klasse zu definieren.

                  Genau so ist es gedacht.

                  "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

                  Proxmox 9.1.1 LXC|8 GB|Core i7-6700
                  HmIP|ZigBee|Tasmota|Unifi
                  Zabbix Certified Specialist
                  Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                  1 Antwort Letzte Antwort
                  0
                  • OliverIOO OliverIO

                    @iphilbln

                    klammerklassen ist meine umschreibung dafür das wenn du das so fortführen würdest, dann hättest du ganz viele unterklassen für eine person.. wie geschrieben das macht in diesem beispiel nicht so viel sinn.
                    2)
                    name hat das attribut name (Zeile 8)
                    surname hat das attribut surname Zeile 23 und 29 (wobei 29 sogar nur eine blockvariable ist, die nach Aufruf von setSurname wieder vergessen wird.
                    Wenn du die Klasse surename erzeugst (Zeile 35) dann wird natürlich auch die basisklassen mit erzeugt.(surename extends name zeile 19)
                    der eine name wird durch den constructor belegt der andere durch eine methode. wie gesagt von der struktur ist das nicht alles so logisch. ich würde einfach das folgende machen

                    /*jshint esversion: 8 */
                    const events = require("events");
                    class Person{
                        constructor(name,surname){
                    
                            this.event = new events.EventEmitter();
                            this._name = name;
                            this._surename = surname;
                        }
                        set name(name) {
                            this._name=name;
                            this.event.emit("attributChanged","name",name);
                            this.event.emit("attributChangedName",name);
                         }
                        set surname(surname) {
                            this._surname=surname;
                            this.event.emit("attributChanged","surname",surname);
                            this.event.emit("attributChangedSurname",surname);
                        }
                        get name() {
                            return this._name;
                        }
                        get surname() {
                            return this._surname;
                        }
                    }
                    
                    var p = new Person("aaa","bbb");
                    p.event.on("attributChanged",(property,value)=>{
                        console.log(`${property} ${value}`);
                    });
                    
                    p.name="ccc";
                    
                    iPhilBlnI Offline
                    iPhilBlnI Offline
                    iPhilBln
                    schrieb am zuletzt editiert von
                    #12

                    @oliverio hmm ich weiß nicht, ob wir eventuell grade etwas aneinander vorbeireden, weil du dich sehr an meinem simplen Beispiel von oben aufhängst. Mir ging es dabei primär darum mit einem abstrakten Beispiel die generelle Funktion zu verstehen . Ich denke wir sind uns einig, dass man bei nur 2 Attributen nicht mit 2 Klassen und Vererbung arbeitet. Vielleicht kam das vorher nicht so gut rüber?
                    Mein eigentliches Skript wird meine Heizungssteuerung. Der prinzipielle Aufbau sieht dann folgende Klassen vor:

                    • class Heating
                      • alle wichtigen, grundlegenden Steuerungen und States
                    • class "Raumname" extends Heating
                      • Sonderfunktionen des jeweiligen Raums ( Nachtmodus, Aufstehen, Batteriewarnungstext, etc)

                    Daher muss die erbende Klasse ja auf Änderungen einiger Attribute der Klasse Heating reagieren, sofern ich nicht jede Methode in der erbenden Klasse neu schreiben möchte. Nichts desto trotz hast du mir den richtigen Anstoß mit dem Eventemitter geliefert, der mir das ermöglicht.

                    @Codierknecht

                    Daher war eigentlich die Idee eine Oberklasse zu schreiben und nur Methoden die nicht identisch sind dann in einer erbende Klasse zu definieren.

                    Genau so ist es gedacht.

                    Gut, dann sind wir denke ich einer Meinung. :)

                    OliverIOO 1 Antwort Letzte Antwort
                    0
                    • iPhilBlnI iPhilBln

                      @oliverio hmm ich weiß nicht, ob wir eventuell grade etwas aneinander vorbeireden, weil du dich sehr an meinem simplen Beispiel von oben aufhängst. Mir ging es dabei primär darum mit einem abstrakten Beispiel die generelle Funktion zu verstehen . Ich denke wir sind uns einig, dass man bei nur 2 Attributen nicht mit 2 Klassen und Vererbung arbeitet. Vielleicht kam das vorher nicht so gut rüber?
                      Mein eigentliches Skript wird meine Heizungssteuerung. Der prinzipielle Aufbau sieht dann folgende Klassen vor:

                      • class Heating
                        • alle wichtigen, grundlegenden Steuerungen und States
                      • class "Raumname" extends Heating
                        • Sonderfunktionen des jeweiligen Raums ( Nachtmodus, Aufstehen, Batteriewarnungstext, etc)

                      Daher muss die erbende Klasse ja auf Änderungen einiger Attribute der Klasse Heating reagieren, sofern ich nicht jede Methode in der erbenden Klasse neu schreiben möchte. Nichts desto trotz hast du mir den richtigen Anstoß mit dem Eventemitter geliefert, der mir das ermöglicht.

                      @Codierknecht

                      Daher war eigentlich die Idee eine Oberklasse zu schreiben und nur Methoden die nicht identisch sind dann in einer erbende Klasse zu definieren.

                      Genau so ist es gedacht.

                      Gut, dann sind wir denke ich einer Meinung. :)

                      OliverIOO Offline
                      OliverIOO Offline
                      OliverIO
                      schrieb am zuletzt editiert von
                      #13

                      @iphilbln

                      dann ist gut

                      Meine Adapter und Widgets
                      TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                      Links im Profil

                      1 Antwort Letzte Antwort
                      1
                      Antworten
                      • In einem neuen Thema antworten
                      Anmelden zum Antworten
                      • Älteste zuerst
                      • Neuste zuerst
                      • Meiste Stimmen


                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      612

                      Online

                      32.6k

                      Benutzer

                      82.3k

                      Themen

                      1.3m

                      Beiträge
                      Community
                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                      ioBroker Community 2014-2025
                      logo
                      • Anmelden

                      • Du hast noch kein Konto? Registrieren

                      • Anmelden oder registrieren, um zu suchen
                      • Erster Beitrag
                        Letzter Beitrag
                      0
                      • Home
                      • Aktuell
                      • Tags
                      • Ungelesen 0
                      • Kategorien
                      • Unreplied
                      • Beliebt
                      • GitHub
                      • Docu
                      • Hilfe