Mit Verbindungsüberprüfungen wird eingeschränkt, welche Verbindungen (und damit Blöcke) miteinander verbunden werden können.
Verbindungsüberprüfungen sind für Modelltypen nützlich. Die folgenden drei Blöcke sollten beispielsweise nicht miteinander verbunden sein, da sie Code darstellen, der unterschiedliche Typen zurückgibt:
Mit Verbindungsüberprüfungen können Sie verhindern, dass diese Blöcke eine Verbindung herstellen. So erhalten Nutzer sofort Feedback und viele einfache Fehler werden vermieden.
Funktionsweise
Jede Verbindung kann mit einer „Verbindungsüberprüfung“ verknüpft werden, die ein nullables Array von Strings ist.
Zwei Verbindungen können verbunden werden, wenn:
- Sie sind kompatible Typen (z.B. eine Ausgabe, die mit einer Eingabe verbunden ist).
- Sie haben mindestens einen String in der Verbindungsüberprüfung gemeinsam.
So könnten beispielsweise Verbindungen mit den folgenden beiden Prüfungen verbunden werden, da sie den String 'apple'
gemeinsam haben:
['apple', 'ball', 'cat']
['apple', 'bear', 'caterpillar']
Verbindungen mit diesen beiden Prüfungen konnten jedoch nicht hergestellt werden, da sie keine gemeinsamen Strings haben:
['apple', 'ball', 'cat']
['ape', 'bear', 'caterpillar']
Es gibt noch einen weiteren Sonderfall. Wenn eines der Arrays null
ist, können auch die beiden Verbindungen verbunden werden. So können Sie Verbindungen definieren, die mit allem verbunden werden können.
null
['ape', 'bear', 'caterpillar]
Beispiele
Eine Liste mit Beispielen zur Verwendung von Verbindungsüberprüfungen finden Sie im Playbook zur Verbindungsüberprüfung.
Prüfungen festlegen
Standardmäßig haben alle Verbindungen eine null
-Verbindungsüberprüfung, d. h., sie können eine Verbindung zu allem herstellen. Verbindungsüberprüfungen müssen manuell zugewiesen werden.
Wie Sie Verbindungen Verbindungsüberprüfungen zuweisen, hängt davon ab, ob Sie JSON-Blockdefinitionen oder JavaScript-Blockdefinitionen verwenden.
JSON
Bei Verbindungen der obersten Ebene weisen Sie die Prüfung direkt der Property zu, die die Verbindung definiert. Der von Ihnen zugewiesene Wert kann null
, ein String (der der einzige Eintrag in der Verbindungsüberprüfung wird) oder ein Array von Strings sein.
{
'type': 'custom_value_block',
'output': 'a connection check entry',
},
{
'type': 'custom_statement_block',
'nextStatement': null, // null check
'previousStatement': ['four', 'connection', 'check', 'entries']
}
Bei Eingaben können Sie die Prüfung einer check
-Property der Eingabedefinition zuweisen. Wenn die Property check
nicht vorhanden ist, wird die Prüfung als null
betrachtet. Der zugewiesene Wert kann ein String oder ein Array von Strings sein.
{
'type': 'custom_block',
'message0': '%1 %2',
'args0': [
{
'type': 'input_value',
'check': 'a connection check entry' // Accepts custom_value_block
},
{
'type': 'input_statement',
'check': ['two', 'entries'] // Accepts custom_statement_block
}
]
}
JavaScript
Bei Verbindungen der obersten Ebene können Sie die Prüfung direkt an die Methode übergeben, die die Verbindung definiert. Wenn Sie keinen Wert übergeben, wird für die Prüfung null
verwendet. Der übergebene Wert kann ein String (der der einzige Eintrag in der Verbindungsüberprüfung wird) oder ein Array von Strings sein.
Blockly.Blocks['custom_value_block'] = {
init: function() {
this.setOutput(true, 'a connection check entry');
}
};
Blockly.Blocks['custom_statement_block'] = {
init: function() {
this.setNextStatement(true); // null check
this.setPreviousStatement(true, ['four', 'connection', 'check', 'entries']);
}
};
Bei Eingaben können Sie die Prüfung an die Methode setCheck
übergeben, nachdem Sie die Eingabe definiert haben. Wenn die Methode setCheck
nicht aufgerufen wird, gilt die Prüfung als null
. Der übergebene Wert kann ein String oder ein Array von Strings sein.
Blockly.Blocks['custom_block'] = {
init: function() {
this.appendValueInput('NAME')
.setCheck('a connection check entry'); // Accepts custom_value_block
this.appendStatementInput('NAME')
.setCheck(['two', 'entries']); // Accepts custom_statement_block
}
};
Integrierte Prüfstrings
Die vordefinierten Blöcke haben Verbindungsüberprüfungen mit den Werten 'Array'
, 'Boolean'
, 'Colour'
, 'Number'
und 'String'
. Wenn Sie möchten, dass Ihre Blöcke mit den vordefinierten Blöcken interagieren, können Sie diese Werte verwenden, um sie kompatibel zu machen.
Beschränkungen
Dieses System ist ziemlich robust und kann viele Anwendungsfälle lösen, hat aber einige Einschränkungen.
Kontext einschränken
Dieses System unterstützt nicht von selbst die Einschränkung des „größeren Kontexts“, in dem eine Verbindung hergestellt werden darf. Sie können beispielsweise nicht festlegen, dass ein break
-Block nur innerhalb eines loop
-Blocks zulässig ist. Das System zur Verbindungsüberprüfung berücksichtigt nur die beiden unmittelbar verbundenen Verbindungen.
Sie können dies mithilfe des Ereignissystems unterstützen, indem Sie Blockbewegungsereignisse überwachen und prüfen, ob der Block falsch positioniert ist.
Blockly.Blocks['custom_block'] = {
init: function() { }
onchange: function(e) {
if (this.workspace.isDragging()) return;
if (e.type !== Blockly.Events.BlockMove) return;
if (!this.getSurroundLoop()) this.outputConnection.disconnect();
}
loopTypes: new Set(); // Your valid *block types* (not connection checks).
getSurroundLoop: function () {
let block = this.getSurroundParent();
do {
if (loopTypes.has(block.type)) return block;
block = block.getSurroundParent();
} while (block);
return null;
},
}
Generische Typen
Dieses System unterstützt nicht von selbst die Definition von generischen Typen. Sie können beispielsweise keinen Identitätsblock erstellen, der unabhängig von der Eingabe immer dieselbe Ausgabe liefert.
Sie können dies ein wenig unterstützen, indem Sie die Verbindungsüberprüfung an der Ausgabe des Blocks aktiv so ändern, dass sie mit der Eingabe übereinstimmt. Das können Sie mit dem Ereignissystem tun, um auf Blockierungsbewegungsereignisse zu warten.
Blockly.Blocks['custom_block'] = {
init: function() { }
onchange: function(e) {
if (e.type !== Blockly.Events.BlockMove) return;
this.setOutput(
true, this.getInputTargetBlock()?.outputConnection.getCheck());
}
}
Wenn der verbundene Block aber auch generisch ist, funktioniert das nicht richtig. Es gibt keine gute Problemumgehung für diesen Fall.
Verbindungsprüftools
Wenn dieses System für Ihren Anwendungsfall nicht geeignet ist, können Sie auch ändern, wie die Verbindungsüberprüfungen verglichen werden, indem Sie eine benutzerdefinierte Verbindungsüberprüfung erstellen.
Wenn Sie beispielsweise ein erweitertes System erstellen möchten, das einige der Einschränkungen dieses Systems behebt, können Sie eine benutzerdefinierte Verbindungsüberprüfung erstellen.