NEWS
Klassen Import mit jQuery möglich?
-
Ich möchte eine Klasse per requite importierern. Prinzpiell geht das, Beispiel:
class MyClass{ constructor(){this.Hallo = "Hallo"} }
const MyClass = require('./MyClass.js'); const MyInstance = new MyClass(); log(MyInstance.Hallo); => "Hallo"
Wenn aber in der Klasse ein jquery Operator verwendet wir,
this.LichtDP = $('alias.0.Licht.*Zustand');
Dann klappt das nicht mehr, Fehlermeldung:
ReferenceError: $ is not defined
Frage: Kann man Klassen die jquery verwenden exportieren und importieren?
-
im Java Skript Adapter funktioniert jquery nicht.
Jquery funktioniert nur in einem Browser
im Java Skript Adapter arbeitest du aber mit Node in einer reinen Server Umgebung .
Wenn du mit jquery ähnlichem Syntax in node arbeiten möchtest, musst du Cheerio laden
https://www.npmjs.com/package/cheerio
Bitte vorher immer checken, ob das von dir gewünschte auch unterstützt wird.
Wie gesagt, alle direkten browserbezogenen Befehle stehen nicht zur Verfügung, da diese Objekte unter Node nicht zur Verfügung stehenWas deine Verwendung von jquery allerdings nun mit require und Klasse zu tun hat, hab ich noch nicht verstanden
-
@oliverio sagte in Klassen Import mit jQuery möglich?:
Was deine Verwendung von jquery allerdings nun mit require und Klasse zu tun hat, hab ich noch nicht verstanden
Ich möchte Klassen in unterschiedliche Dateien auslagern (um die Übersichtlichkeit zu erhöhen).
Ich habe bisher keine andere Möglichkeit als "require" gefunden um Klassen aus unterschiedlichen Dateien in ein JS Skript einzubinden (ich nehme gerne bessere Ideen an). Dabei ist mir eben aufgefallen, dass das nur so lange gut geht wie die ausgelagerte Klasse keine jquery Methode verwendet.
Oder anderst ausgedrückt: Wie kann man eine Klasse die über jqeury einen Satz an Datenpunkten ermittelt in ein JS Skript einbinden, das sich in einer anderen Datei befindet? -
Wenn du etwas komplexeres programmieren möchtest, würde ich dir raten, deine Funktionalitäten in einen eigenständigen Adapter auszulagern.
Eine Kommunikation zwischen einem Skript und einem Adapter kann dann entweder über datenpunkte oder über den sendto Befehl erfolgen.Wenn du dennoch diesen Weg weiter verfolgen willst, dann schaue dir den require Befehl an
https://nodejs.org/docs/latest/api/modules.html#requireid
Dort kann man Dateien entsprechend per Pfad oder Modul id ladenDer Pfad aus der die Datei geladen wird, muss allerdings innerhalb der node hierarchie liegen.
Da wir hier allerdings 2 Hierarchien untereinander haben (ioBroker und JavaScript Adapter) musst du ausprobieren, wo du den Pfad platzieren kannst. (Start einer Hierarchie ist immer der Ort wo die Datei package.json liegt und als eigenständiger Prozess gestartet wird.
Also ganz sicher irgendwo unterhalb des Java Skript Adapters
Idealerweise geht auch /opt/Iobroker/files
Innerhalb des Java Skript Adapters ist halt unschön, da bei Aktualisierung diese Daten gelöscht werden.
Leider hat node auch Probleme mit Dateisystem links.Die Möglichkeiten mit npm aus einem lokalen repository zu installieren lasse ich mal aus, da auch das bei einer Aktualisierung wieder weg wäre. In der Konfiguration des JavaScript einen lokalen Pfad einzutragen zu einem lokalen repo geht glaube ich nicht.
Ich hoffe, dass ich dich mit diesen ganzen node details nicht verwirre.
-
@wolfgangfb sagte in Klassen Import mit jQuery möglich?:
Wenn aber in der Klasse ein jquery Operator verwendet wir,
- Das ist in der JavaScript-Sandbox kein jQuery, sondern ein $-Selektor. Siehe https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#---selector
- Der Code ist also durchaus gültig, hat nur halt nichts mit jQuery zu tun
- Die Funktion mit dem Namen
$
ist in der sandbox vom JavaScript-Adapter definiert. Möchtest Du diese in der Klasse verwenden, ist es wahrscheinlich am einfachsten diese perthis
im Constructor mitzunehmen.
class MyClass{ constructor(sandbox){ this.sb = sandbox; } }
const MyInstance = new MyClass(this);
this.LichtDP = this.sb.$('alias.0.Licht.*Zustand');
-
@oliverio sagte in Klassen Import mit jQuery möglich?:
Idealerweise geht auch /opt/Iobroker/files
Das ginge, aber dort bitte nicht per Dateisystem irgendwelche Daten hinkopieren, sondern nur mit den ioBroker-Funktionen. Also entweder über das Dateien-Tab im Admin oder über die CLI-Funktionen. Sonst fehlen dem ioBroker die Meta-Daten.
-
@haus-automatisierung sagte in Klassen Import mit jQuery möglich?:
Sonst fehlen dem ioBroker die Meta-Daten
braucht man die nicht nur, wenn die datei über webserver abgerufen werden soll? node greift ja direkt über dateisystem zu.
allerdings sollten die dateien für den user iobroker lesbar sein -
Super, vielen Dank, das mit der Sandbox funktioniert. Was noch nicht funktioniert ist der Zugrif auf die im JS Adapter gespiegelten Dateien, da bekomme ich immer die Meldung "nicht gefunden". Relative Pfaddangaben bekomme ich auch nich hin. Besonders nervend ist, dass bei jeder Änderung einer zu importierenden Datei der JS Adapter neu gestartet werden muss weil sonst die Änderungen nicht übernommen werde, gibt es da eine Abhilfe?
-
@wolfgangfb sagte in Klassen Import mit jQuery möglich?:
Besonders nervend ist, dass bei jeder Änderung einer zu importierenden Datei der JS Adapter neu gestartet werden muss weil sonst die Änderungen nicht übernommen werde, gibt es da eine Abhilfe?
Naja - das Vorgehen ist ja so auch irgendwo dokumentiert oder empfohlen. Eigentlich müsste es aber reichen, das entsprechende Script neuzustarten (dann wird ja das require() erneut ausgeführt).
Seit Version v7.11.1 gibt es
defaultDataDir
in der Sandbox. Das zeigt auf/opt/iobroker/iobroker-data/
(oder wo auch immer der ioBroker läuft). Damit könnte man den Pfad leichter zusammenbauen.Aber wie gesagt: Alles, was Du da versuchst, ist nicht empfohlen oder offiziell unterstützt. Warum die Klassen nicht als eigenes Script in
global
ablegen und dann verwenden?