NEWS
Widgetentwicklung und dynamische ObjectID
-
Ich entwickle gerade ein Widget in dem ich die StateIDs dynamisch ermittle.
Für diese StateIDs möchte ich dann die Änderungen mitbekommen.
Leider funktioniert in diesem Fall das folgende nicht, da die states nicht in der Auflistung vis.states enthalten sind, und wenn sie enthalten sind, dann enthält der .val Wert immer null.vis.states.bind(stateid + '.val', this.onChange
Beim debuggen habe ich festgestellt, dass vis in einem aufwändigen Verfahren (getUsedObjectIDs) versucht alle notwendigen States einzusammeln, die sich dann auch aktualisieren. Da diese StateIDs aber dynamisch erzeugt werden, bekommt das dieser Mechanismus so nicht mit.
Eine weitere Alternative ist, die StateIDs in die data-Auflistung in der Binding-Notation {xx.0.yy.zz} zu schreiben. Dann funktioniert zwar das aktualisieren, aber vis löscht automatisch bei jeder Aktualisierung das widget und lässt es dann neu aufbauen. Dies erzeugt hässliche Flackereffekte,
Ein 3. Weg wäre noch selbst die Ids über socket.emit(subscribe,ID) über den Server zu abonnieren.
Wenn ich mich dann an das StateChange-Ereignis des SDervers hänge, bekomme ich leider alle Änderungen mit.Hat jemand noch eine elegantere Methode oder kann mir einen Hinweis geben, evtl. habe ich die 3 Methoden ja nicht richtig eingesetzt.
-
@OliverIO Ich habe letztens beim debuggen gesehen, dass das vis Objekt eine Funktion
subscribeStates
besitzt, evtl. kann man so States abonnieren, die dann auch im States Array aktualisiert werden, habe es allerdings bislang noch nicht gebraucht. -
@foxriver76 Danke für den Hinweis. Diese Funktion habe ich gesehen. Diese nimmt aber als Parameter nur den Namen einer view an und ist der Ausgangspunkt für Szenario 1
-
@OliverIO man muss die Platzhalter definieren. Z.b oid1, oid2 als Attribute und die Felder bei der Konfiguration automatisch setzen.
So funktionieren viele hqWidgets.
D.h Dynamik bei der Konfiguration und nicht bei Run-Modus implementieren.
-
-
Ich habe eine Lösung gefunden, nachdem ich noch tiefer in den code von vis abgetaucht bin.
Ich muss sagen, da läuft ziemlich viel magic ab, was die Lesbarkeit und Nachvollziehbarkeit
mancher Verhaltensweisen nicht gerade einfach macht.Fragestellung war, wie abonniere ich Datenpunkte und bekomm Änderungen mit, obwohl die Datenpunkte in vis noch niergend bekannt gemacht worden sind.
Die Lösung von Bluefox, diese über oid# (#gleich eine beliebige Nummer -> das ist so eine Magie die leider nicht dokumentiert ist) umzusetzen, hat mir nicht so gut gefallen, da ich den Anwender von der (möglichen) Eingabe von Datenpunkten, die nicht notwendig sind fern halten möchte.Hier mal exemplarisch meine Lösung:
// wie gesagt, bei mir wird diese Auflistung dynamisch auf Basis anderer Angaben generiert. //Hier der einfachhalber einfach als fix definiertes Array var dps= ['adapter.0.dp1','adapter.0.dp2','adapter.0.dp3']; //Dann erst einmal die Daten beim Server abfragen vis.conn.getStates(dps, function (error, states) { //dann die Daten in der Verwaltung von vis aktualisieren //dadurch landen die Daten dann in vis.states vis.updateStates(states); //Dann vis veranlassen, das er die Daten selbst beim server abonniert und aktuell hält vis.conn.subscribe(dps); for (var i=0;i<dps.length;i++) { //dann alle die Datenpunke in deinem code von vis abonnieren //this.onChange wird dann aufgerufen, wenn eine Wertänderung erfolgt //in der Auflistung vis.states sind alle Datenpunkte mit ihren Unterwerten notiert (also .val,.ack,.ts,etc. //daher muss hier noch ein .val angefügt werden. dps[i]=dps[i]+'.val'; vis.states.bind(dps[i] , this.onChange); } //bind verbraucht ressourcen/speicherplatz im browser und wird nicht automatisch aufgehoben, wenn //das widget zerstört/geändert wird, so kann es sein, das bei vielfachem neu erzeugen hier ein Speicherleck //entsteht. //Da vis in manchen Situationen das widget zerstört/löscht und dann wieder aufbaut, muss noch folgendes //notiert werden. $div ist das äußerste div um dein widget. dadurch kann vis sich um das unbind selber kümmern var $div = $('#' + widgetID); $div.data('bound', dps); $div.data('bindHandler', this.onChange); }
-
Участник @OliverIO написал в Widgetentwicklung und dynamische ObjectID:
obwohl die Datenpunkte in vis noch niergend bekannt gemacht worden sind.
Die Lösung von Bluefox, diese über oid# (#gleich eine beliebige Nummer -> das ist so eine Magie die leider nicht dokumentiert ist) umzusetzen, hat mir nicht so gut gefallen, da ich den Anwender von der (möglichen) Eingabe von Datenpunkten, die nicht notwendig sind fern halten möchte.
Hier mal exemplarisch meine Lösung:Na ja... Das wird natürlich funktionieren.