NEWS
UNSOLVED Mögliches Speicherleck in den Templates für adapter und vis
-
Unter folgendem Link habe ich einen neuen Fehler erstellt
https://github.com/ioBroker/ioBroker.template/issues/62Da ich aktuell einen neuen Adapter erstelle und diesen mit dem adapter-wizard vorbereitet habe,
ist mir im template widget code aufgefallen, das sich da ein mögliches Speicherleck versteckt.Es wird ein state abonniert (bind), aber nicht wieder deabonniert (unbind).
Wird das widget neu gezeichnet, weil sich bspw der Datenpunkt geändert hat,
so wird immer wieder neu der Datenpunkt abonniert, ohne die nicht mehr gültigen Abonnements zu löschen.Das geht zum einen manuell vis.states.unbind(datenpunkt,änderungshandler).
Eleganter ist aber, man fügt das Abonnement einer widgetvariable (stichwort data('bound') und data('boundhandler')
Dann kümmert sich vis selbst um das aufräumen.Wenn man das nicht macht, sammeln sich bei jeder Neuzeichnung immer mehr Abos an, die bei Änderung des Datenpunkts auch alle aufgerufen werden. Das kann schnell die Oberfläche ziemlich laggy machen (selbst in einem anderen Situation erlebt)
Da das ja Template code ist, ist der Fehler nicht kritisch.
Wenn aber jemand einen neuen Adapter anfängt und widgets programmiert und das nicht weiß (steht leider auch sonst nirgends), dann gibt es Probleme, die hier im Forum wieder gelöst werden müssen.
@AlCalzone -
@OliverIO Ich kenne mich mit den VIS-Templates nicht aus. Wenn du den Fix kennst würde ich mich über ein Issue freuen, in dem du kurz beschreibst, welche Zeilen wie geändert werden müssen.
-
Habe Pull request erstellt
https://github.com/ioBroker/ioBroker.template/pull/63Ich habe allerdings aktuell keine Test instanz auf der ich das ordentlich testen könnte.
Deswegen habe ich den code in den von mir erzeugten adapter kopiert. Aber besser ist nochmal unabhängig testen- Bitte bei dir installieren
- Dann ein Testadapter JS+VIS und TS+VIS erstellen
- Dann Instanzen anlegen
- Dann für beide jeweils die beiden erzeugten widgets ins vis legen
- Dann die developer console öffnen im reiter console darf kein Fehler für diesen adapter erscheinen.
Noch ein Hinweis, den ich bei einem eigenen Test gemerkt habe.
Der Adaptername muss den folgenden Anforderungen für Bezeichner von javascript erfüllen.
Ich habe selbst ein bindestrich im adapternamen verwendet, wurde auch alles anstandslos verarbeitet.
Bei vis-widgets gibt es dann allerdings probleme, da der adaptername auch als berzeichner verwendet wird
und alle template-strings durch den adapter namen ersetzt werden.- Bei selbst vergebenen Namen gelten folgende Regeln:
- sie dürfen keine Leerzeichen enthalten
- sie dürfen nur aus Buchstaben und Ziffern bestehen - das erste Zeichen muss ein Buchstabe sein; es sind Groß- und
- Kleinbuchstaben erlaubt. Groß- und Kleinschreibung werden unterschieden!
- sie dürfen keine deutschen Umlaute oder scharfes S enthalten
- sie dürfen als einziges Sonderzeichen den Unterstrich "_" enthalten
- sie dürfen nicht mit einem reservierten Wort identisch sein.
-
@OliverIO Der Fix für die zweite Hälfte war viel einfacher als gedacht:
- vis.binds.test-widget.createWidget(this.data.wid, this.view, this.data, this.style); + vis.binds['test-widget'].createWidget(this.data.wid, this.view, this.data, this.style);
Das war die einzige Stelle, wo nicht über diese Syntax auf die Eigenschaften zugegriffen wird.
-
@AlCalzone
ok, stimmt, aber punkt Schreibweise geht dann nicht mehr, sondern man muss das immer so im browsercode schreiben.
so eine kleine warnung im adapter creater wäre doch schön.Hintergrund: Als ich gestern den Adapter unterbau fertig gestellt habe,
wollte ich dann das erste Widget probieren. Es hat eine weile gedauert bis ich den Fehler gefunden habe, bzw. verstanden hab warum das schief ging.habe dann den kompletten adapter umbenannt, weil ich einen einheitlichen namen wollt.
will nur nicht, das es anderen genauso geht und gefrustet sind. -
@OliverIO Ist allerdings schon an einigen anderen Stellen schon länger (schon immer?) so gewesen. Zumindest stammt der widget-Code aus Zeiten, als es ein separates Widget-Template gab. Die Änderung macht es nur einheitlich an der einen Stelle, wo es noch nicht so war.