Pemeriksaan koneksi membatasi koneksi mana (dan oleh karena itu blok) yang dapat saling terhubung.
Pemeriksaan koneksi berguna untuk jenis pemodelan. Misalnya, tiga blok berikut tidak boleh terhubung, karena mewakili kode yang menampilkan jenis yang berbeda:
Pemeriksaan koneksi dapat digunakan untuk mencegah blok ini terhubung. Hal ini memberikan masukan instan kepada pengguna dan mencegah banyak kesalahan sederhana.
Cara kerjanya
Setiap koneksi dapat dikaitkan dengan "pemeriksaan koneksi" yang merupakan array string nullable.
Dua koneksi dapat terhubung jika:
- Keduanya adalah jenis yang kompatibel (misalnya, output yang terhubung ke input).
- Keduanya memiliki setidaknya satu string yang sama dalam pemeriksaan koneksinya.
Misalnya, koneksi dengan dua pemeriksaan berikut dapat terhubung, karena
memiliki string 'apple'
yang sama:
['apple', 'ball', 'cat']
['apple', 'bear', 'caterpillar']
Namun, koneksi dengan kedua pemeriksaan ini tidak dapat terhubung, karena tidak memiliki string yang sama:
['apple', 'ball', 'cat']
['ape', 'bear', 'caterpillar']
Ada satu kasus khusus lainnya. Jika salah satu array adalah null
, kedua koneksi tersebut juga dapat terhubung. Hal ini memungkinkan Anda menentukan koneksi yang dapat terhubung
ke apa pun.
null
['ape', 'bear', 'caterpillar]
Contoh
Untuk daftar contoh cara menggunakan pemeriksaan koneksi, lihat Playbook pemeriksaan koneksi.
Menetapkan pemeriksaan
Secara default, semua koneksi memiliki pemeriksaan koneksi null
, yang berarti koneksi tersebut dapat
terhubung ke apa pun. Pemeriksaan koneksi harus ditetapkan secara manual.
Cara Anda menetapkan pemeriksaan koneksi ke koneksi berbeda-beda, bergantung pada apakah Anda menggunakan definisi blok JSON, atau definisi blok JavaScript.
JSON
Untuk koneksi tingkat teratas, Anda menetapkan pemeriksaan langsung ke properti yang menentukan koneksi. Nilai yang Anda tetapkan dapat berupa null
, string (yang menjadi satu-satunya entri dalam pemeriksaan koneksi), atau array string.
{
'type': 'custom_value_block',
'output': 'a connection check entry',
},
{
'type': 'custom_statement_block',
'nextStatement': null, // null check
'previousStatement': ['four', 'connection', 'check', 'entries']
}
Untuk input, Anda dapat menetapkan pemeriksaan ke properti check
dari definisi
input. Jika properti check
tidak ada, pemeriksaan dianggap
null
. Nilai yang Anda tetapkan dapat berupa string, atau array string.
{
'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
Untuk koneksi tingkat teratas, Anda dapat meneruskan pemeriksaan langsung ke metode yang
menentukan koneksi. Jika Anda tidak meneruskan nilai, pemeriksaan akan dianggap
null
. Nilai yang Anda teruskan dapat berupa string (yang menjadi satu-satunya entri dalam
pemeriksaan koneksi), atau array string.
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']);
}
};
Untuk input, Anda dapat meneruskan pemeriksaan ke metode setCheck
, setelah
menentukan input. Jika metode setCheck
tidak dipanggil, pemeriksaan dianggap
null
. Nilai yang Anda teruskan dapat berupa string, atau array string.
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
}
};
String pemeriksaan bawaan
Blok bawaan memiliki pemeriksaan koneksi dengan nilai 'Array'
,
'Boolean'
, 'Colour'
, 'Number'
, dan 'String'
. Jika ingin blok Anda
beroperasi bersama dengan blok bawaan, Anda dapat menggunakan nilai ini untuk membuatnya
kompatibel.
Batasan
Sistem ini cukup andal dan dapat menyelesaikan banyak kasus penggunaan, tetapi memiliki beberapa batasan.
Membatasi konteks yang lebih besar
Sistem ini, dengan sendirinya, tidak mendukung pembatasan "konteks yang lebih besar" tempat
koneksi diizinkan untuk terhubung. Misalnya, Anda tidak dapat mengatakan bahwa
blok break
hanya diizinkan untuk ada di dalam blok loop
. Sistem pemeriksaan koneksi hanya mempertimbangkan dua koneksi langsung yang terhubung.
Anda dapat mendukung hal ini dengan menggunakan sistem peristiwa untuk memproses peristiwa pemindahan blok dan memeriksa apakah blok salah diposisikan.
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;
},
}
Jenis generik
Sistem ini, dengan sendirinya, tidak mendukung penentuan jenis generik. Misalnya, Anda tidak dapat membuat blok "Identity", yang "menampilkan" input apa pun.
Anda dapat secara tidak langsung mendukung hal ini dengan secara aktif mengubah pemeriksaan koneksi pada output blok agar cocok dengan inputnya. Yang dapat Anda lakukan menggunakan sistem peristiwa untuk memproses peristiwa pemindahan blok.
Blockly.Blocks['custom_block'] = {
init: function() { }
onchange: function(e) {
if (e.type !== Blockly.Events.BlockMove) return;
this.setOutput(
true, this.getInputTargetBlock()?.outputConnection.getCheck());
}
}
Namun, jika blok yang terhubung juga generik, hal ini tidak akan berfungsi dengan benar. Tidak ada solusi yang baik untuk kasus ini.
Pemeriksa koneksi
Jika sistem ini tidak berfungsi untuk kasus penggunaan Anda, Anda juga dapat mengubah cara pemeriksaan koneksi dibandingkan dengan membuat pemeriksa koneksi kustom.
Misalnya, jika ingin membuat sistem yang lebih canggih yang menangani beberapa batasan dari sistem ini, Anda dapat membuat pemeriksa koneksi kustom.