NEWS
[gelöst] .on / .each warum unterschiedliches obj als Antwort
-
@hanss Ich hab da an der Erklärung nochmal was angepasst. Das Objekt ist nur ein kleiner Teil des Unterschiedes.
@hanss sagte in .on / .each warum unterschiedliches obj als Antwort:
Wie kann ich dieses Objekt abfragen, wenn ich die ID habe?
getEigenesObject(id)Die frage verstehe ich nicht. Vielleicht beschreibst du das gesamte Problem mal
-
@hanss sagte:
Wie kann ich dieses Objekt abfragen, wenn ich die ID habe?
Die Eigenschaften des Datenpunkt-Objektes werden im Funktionsparameter übergeben. Da es es sich sowohl um das statische Objekt handelt als auch um den Zustand, bezeichne ich die Variable mit dp.
Selector.on(function(dp) { log(dp.state.val); // Wert aus Zustand log(dp.common.name); // Name aus statischem Objekt log(dp.id); // ID des Triggers });
.each liefert lediglich die ID der Datenpunkte. Auf das statische Objekt muss man mit getObject(id) zugreifen, auf den Zustand mit getState(id).
-
@paul53
Vielen Dank.
Wie geht es dann, wenn ich auch noch Aufzählungen benötige?
Welches Objekt ist dann das Richtige?
Für mich ist das alles sehr verwirrend, weil nicht Objekt gleich Objekt ist.let raum = getObject(obj.id, "rooms"); let raumname = String(raum.enumNames);
-
@Asgothian
Es gibt eine Funktion, der das Objekt übergeben wird.
Diese wird einmal über eine .each Schleife und einmal mit .on aufgerufen.
Ich glaube ich stelle die Funktion um und übergebe die ID.function OGset(obj){ Anwesend = obj.state.val; // true = da; false = abwesend let raum = getObject(obj.id, "rooms"); let raumname = String(raum.enumNames);
-
@hanss sagte:
Welches Objekt ist dann das Richtige?
Das Array mit Raumnamen wird zusätzlich im Objekt in der Eigenschaft enumNames übergeben.
let obj = getObject(dp.id, "rooms"); let raumname = obj.enumNames[0];
Bei on() werden auch enumNames als Array übergeben:
let enums = dp.enumNames; // Array mit Aufzählungen
-
Das ist doch einfach:
idsWerDa.on(OGset) idsWerDa.each(function(id, i) { let tempobj = {} tempobj.state = getState(id) OGset(tempobj) }
Die Lösung nur die ID zu übergeben und immer mit getState zu arbeiten ist beim .on unpraktisch.
-
@Asgothian @paul53
ich bekomme es einfach nicht hin.
Bitte hier einmal die erforderlichen Änderungen vornehmen.
Vielen Dank schon mal.const idsWerDA = $('state(functions=werdaog)'); // tr-064.0.devices.Galaxy-J5.active idsWerDA.each(function(id, i) { // Programm Start: alle Anwesenden im OG ermitteln // hier id in obj umwandeln OGset(obj) idsWerDA.on(function(obj) { // alle Objekte mit Änderung werdaog OGset(obj) //----------------------------------------------------- function OGset(obj){ Anwesend = obj.state.val; // true = da; false = abwesend let raum = getObject(obj.id, "rooms"); let raumname = String(raum.enumNames); // Raumname der Änderung
-
@hanss sagte:
Bitte hier einmal die erforderlichen Änderungen vornehmen.
Du möchtest das (annähernd) gleiche Objekt an eine Funktion sowohl aus .on() und auch aus .each() übergeben ?
idsWerDA.each(function(id, i) { // Programm Start: alle Anwesenden im OG ermitteln let obj = getObject(id); obj.id = id; obj.state = getState(id); OGset(obj) });
-
@paul53
Das habe ich schon versucht, funktioniert nicht.
Lt. @Asgothian im 2.Beitrag :
"bei .on bekommst du ein eigenes Objekt, welches
den letzten State beinhaltet
den neuen State beinhaltet
den state beinhaltet."Ich habe jetzt die Funktion OGset(id) so abgeändert, dass ich die ID übergeben kann.
idsWerDA.on(function(obj) { OGset(obj.id) idsWerDA.each(function(id, i) { OGset(id) function OGset(id){ let raum = getObject(id, "rooms");
Das funktioniert und sieht übersichtlich aus.
Mein Fazit:
Niemals ein Objekt an eine Funktion übergeben.
Vielen Dank. -
@hanss sagte:
Ich habe jetzt die Funktion OGset(id) so abgeändert, dass ich die ID übergeben kann.
Das ist die bessere Lösung, wobei mein Vorschlag auch funktionieren muss.