ioBroker.javascript
ioBroker.javascript copied to clipboard
Globale Funktionen in Blockly
Es wäre super, wenn es bei Funktionsblöcken in Blockly die Möglichkeit gäbe, diese als "Global" zu definieren und diese dann als Blöcke zum Aufrufen in jedem Script zur Verfügung zu haben. Der Umweg über einen zusätzlichen Funktionsblock, in welchen dann eine andere Funktion aufgerufen hat, ist unschön und sieht unsauber aus, vor allem wenn man die Funktion dann umbenennt.
Das wäre echt cool. Es gibt manche Funktionen, die man sehr oft braucht. Man müsste die Funktionen, die im Common Ordner zur Verfügung steht durchgehen und als Block anzeigen. Das wäre echt sehr hilfreich.
Das ist technisch leider nicht so einfach. Denn dann müsste man auch verhindern, dass diese Funktionen jemals umbenannt oder die Global-Scripts gelöscht werden können, falls diese noch irgendwo in Verwendung sind. Mal eben einen Parameter hinzufügen geht dann ja nicht.
"Global" heißt in diesem Fall ja einfach, dass das Script vor jedes andere kopiert wird. Als würde man den Code nehmen und vor jedes andere Script kopieren. Daher wird ja auch die komplette Instanz neugestartet, sobald sich ein global script ändert.
Ja klar... Die Skripte werden auch schon jetzt davor rein geschrieben und auch jetzt kann man schon von dort Skripte löschen, auch wenn diese irgendwo gebraucht werden. Auch mit dem Export würde es nicht mehr so funktionieren bzw müsste man auch anpassen, aber machbar wäre es.
Hmm.... Werden die globale Skripte auch jetzt schon vor dem Blockly Skript geschrieben?
Ja, es wird einfach das generierte JavaScript davor kopiert.
@ChrMaass Soo... ich habe das ganze mal durchgespielt und es ist jetzt schon möglich globale Skripte in Blockly zu nutzen. Ich habe, als Beispiel, ein Blockly unter global erzeugt:
Jetzt steht diese Funktion für alle Skripte zur Verfügung... auch Blockly! Dann nehme ich aus Funktionen ein "JS-Funktion mit Ergebis"-Block und schreibe dort lediglich ein return mit der Funktion aus dem global Ordner:
@klein0r Die globale Funktionen werden ja auch im normalen JS auch vorgeschlagen, wenn man mit dem Tippen anfängt. Man könnte vielleicht im Blockly die Funktionen aus dem global Ordner als Block anbieten. Naja... da das Ganze jetzt auch schon nutzbar ist, hätte der Ticket keine hohe Prio.
Genau so mache ich das auch schon lange. Ich habe ein globales Blockly
und in allen anderen Blockly gibt es
mit
alexavoice(ausgabe,echos,ssml,speak);
Dadurch kann ich dann überall in den Blocklly den Block verwenden:
Soo... ich habe das ganze mal durchgespielt und es ist jetzt schon möglich globale Skripte in Blockly zu nutzen.
Ja, logischerweise geht das so. Und jetzt stop mal das globale Script oder benenn die Funktion um. Das müsste der Adapter ja alles abfangen. Das macht es kompliziert. Der Weg "vorwärts" wäre umsetzbar. Dann erwarten die Leute wahrscheinlich auch, dass die Funktion in allen Scripts umbenannt wird (was aktuell technisch gar nicht möglich ist, da das JavaScript aus Blockly auf Client-Seite generiert wird).
Naja... Wenn man z.B. ein Adapter entfernt (z.B. Telegram oder Awtrix) und irgendwo noch den ein Block des Adapters nutzt.... oder selbst im Javascript die Funktion integriert, dann geht das ganz auch nicht und man bekommt Fehlermeldungen.
Und wenn man globale Skripte in Javascript nutzt und die Skripte dann umbenennt, hat man auch jetzt die Probleme. Wenn man Globale Skripte nutzt, muss man wissen was man tut. Deswegen ist der Ordner auch nur sichtbar, wenn man auf Expertenmodus umschaltet.
Aber warte mal... wenn man eine Funktion im Blockly umbenennt, dann wird das im ganzen Skript umbenannt. Die Blöcke werden auch immer automatisch, aus dem globalen Skript, generiert.... dann würde doch das ganze auch "automatisch" umbenannt werden.... Wenn im Blockly Blöcke Änderungen gemacht werden, greifen diese auch auf alle Blöcke in Nutzung.
Was haltet ihr denn davon, wenn in Blockly als Name nur eine art Alias angezeigt wird, den man frei vergeben (und ändern kann), aber intern die als global Markierte Blockly-Funktion einen generierten Namen erhält, den man nicht ändern kann.
Parameter sind doch in JS in der Regel ehr optional, so das es selbst bei Änderung der Parameter nicht zu großen Problemen kommen sollte, oder? Ansonsten friert man die Parameter automatisch ein, sobald mal ein Script auf Global setzt und muss zur Änderung der Parameter eine neue Funktion machen (und die Blöcke rüber kopieren).
Wenn man das schafft, es so zu definieren, dann könnte man Blockly in Zukunft frei erweitern und quasi Blockvorlagen teilen. Alleine durch so kleine Helferfunktionen wie: Setze den Wert nur auf folgenden Wert, wenn der größer als der aktuelle Wert ist (Rollos z.B.) usw., die man immer wieder mal benötigt.
Freue mich über euer Feedback