การตรวจสอบการเชื่อมต่อจะจำกัดการเชื่อมต่อ (และบล็อก) ที่เชื่อมต่อกันได้
การตรวจสอบการเชื่อมต่อมีประโยชน์สําหรับประเภทการประมาณ ตัวอย่างเช่น บล็อก 3 บล็อกต่อไปนี้ไม่ควรเชื่อมต่อกัน เนื่องจากแสดงโค้ดที่แสดงผลประเภทต่างๆ
คุณสามารถใช้การตรวจสอบการเชื่อมต่อเพื่อป้องกันไม่ให้บล็อกเหล่านี้เชื่อมต่อได้ ซึ่งจะช่วยให้ผู้ใช้ได้รับความคิดเห็นทันทีและป้องกันข้อผิดพลาดง่ายๆ หลายประการ
วิธีการทำงาน
การเชื่อมต่อทุกรายการจะเชื่อมโยงกับ "การตรวจสอบการเชื่อมต่อ" ซึ่งเป็นอาร์เรย์สตริงที่อนุญาตค่า Null ได้
การเชื่อมต่อ 2 รายการจะเชื่อมต่อกันได้ในกรณีต่อไปนี้
- อุปกรณ์เป็นประเภทที่เข้ากันได้ (เช่น เอาต์พุตที่เชื่อมต่อกับอินพุต)
- รายการเหล่านี้มีสตริงอย่างน้อย 1 รายการในการตรวจสอบการเชื่อมต่อร่วมกัน
ตัวอย่างเช่น การเชื่อมต่อที่มีการตรวจสอบ 2 รายการต่อไปนี้อาจเชื่อมต่อกันได้เนื่องจากใช้สตริง 'apple'
เดียวกัน
['apple', 'ball', 'cat']
['apple', 'bear', 'caterpillar']
แต่การเชื่อมต่อกับการตรวจสอบ 2 รายการนี้เชื่อมต่อไม่ได้เนื่องจากไม่มีสตริงใดๆ ที่แชร์กัน
['apple', 'ball', 'cat']
['ape', 'bear', 'caterpillar']
ยังมีอีกกรณีพิเศษ 1 กรณี หากอาร์เรย์ใดอาร์เรย์หนึ่งเป็น null
การเชื่อมต่อ 2 รายการก็จะเชื่อมต่อกันได้เช่นกัน ซึ่งช่วยให้คุณกำหนดการเชื่อมต่อที่เชื่อมต่อกับสิ่งใดก็ได้
null
['ape', 'bear', 'caterpillar]
ตัวอย่าง
ดูรายการตัวอย่างวิธีใช้การตรวจสอบการเชื่อมต่อได้ที่Playbook การตรวจสอบการเชื่อมต่อ
ตั้งค่าการตรวจสอบ
โดยค่าเริ่มต้น การเชื่อมต่อทั้งหมดจะมีnull
connection-check ซึ่งหมายความว่าจะเชื่อมต่อกับอะไรก็ได้ คุณต้องกำหนดการตรวจสอบการเชื่อมต่อด้วยตนเอง
วิธีกำหนดการตรวจสอบการเชื่อมต่อให้กับการเชื่อมต่อจะแตกต่างกันไป ขึ้นอยู่กับว่าคุณใช้คําจํากัดความของบล็อก JSON หรือคําจํากัดความของบล็อก JavaScript
JSON
สําหรับการเชื่อมต่อระดับบนสุด คุณจะกําหนดการตรวจสอบให้กับพร็อพเพอร์ตี้ที่กําหนดการเชื่อมต่อโดยตรง ค่าที่คุณกําหนดอาจเป็น null
, สตริง (ซึ่งจะกลายเป็นรายการเดียวในการตรวจสอบการเชื่อมต่อ) หรืออาร์เรย์สตริง
{
'type': 'custom_value_block',
'output': 'a connection check entry',
},
{
'type': 'custom_statement_block',
'nextStatement': null, // null check
'previousStatement': ['four', 'connection', 'check', 'entries']
}
สําหรับอินพุต คุณสามารถกําหนดการตรวจสอบให้กับพร็อพเพอร์ตี้ check
ของคําจํากัดความอินพุต หากไม่มีพร็อพเพอร์ตี้ check
ระบบจะถือว่าการตรวจสอบเป็น null
ค่าที่คุณกําหนดอาจเป็นสตริงหรืออาร์เรย์ของสตริงก็ได้
{
'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
สําหรับการเชื่อมต่อระดับบนสุด คุณสามารถส่งการตรวจสอบไปยังเมธอดที่กําหนดการเชื่อมต่อได้โดยตรง หากไม่ได้ส่งค่า ระบบจะถือว่าการตรวจสอบเป็น null
ค่าที่คุณส่งอาจเป็นสตริง (ซึ่งจะกลายเป็นรายการเดียวในการตรวจสอบการเชื่อมต่อ) หรืออาร์เรย์สตริงก็ได้
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']);
}
};
สําหรับอินพุต คุณสามารถส่งการตรวจสอบไปยังเมธอด setCheck
หลังจากที่ได้กําหนดอินพุตแล้ว หากไม่ได้เรียกใช้เมธอด setCheck
ระบบจะถือว่าการตรวจสอบเป็น null
ค่าที่คุณส่งอาจเป็นสตริงหรืออาร์เรย์ของสตริงก็ได้
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
}
};
สตริงการตรวจสอบในตัว
บล็อกในตัวมีการตรวจสอบการเชื่อมต่อที่มีค่า 'Array'
,
'Boolean'
, 'Colour'
, 'Number'
และ 'String'
หากต้องการให้บล็อกทำงานร่วมกันกับบล็อกในตัว คุณสามารถใช้ค่าเหล่านี้เพื่อให้บล็อกเข้ากันได้
ข้อจำกัด
ระบบนี้มีความเสถียรมากและแก้ปัญหาได้หลายกรณี แต่มีข้อจํากัดบางอย่าง
จำกัดบริบทที่กว้างขึ้น
ระบบนี้ไม่รองรับการจํากัด "บริบทที่กว้างขึ้น" ซึ่งอนุญาตให้เชื่อมต่อ เช่น คุณไม่สามารถระบุว่าบล็อก break
จะต้องอยู่ภายในบล็อก loop
เท่านั้น ระบบตรวจสอบการเชื่อมต่อจะพิจารณาเฉพาะการเชื่อมต่อ 2 รายการที่เชื่อมต่ออยู่เท่านั้น
คุณสามารถรองรับการดำเนินการนี้โดยใช้ระบบเหตุการณ์เพื่อฟังเหตุการณ์การย้ายบล็อก และตรวจสอบว่าบล็อกอยู่ในตำแหน่งที่ไม่ถูกต้องหรือไม่
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;
},
}
ประเภททั่วไป
ระบบนี้ไม่รองรับการกำหนดประเภททั่วไป เช่น คุณไม่สามารถสร้างบล็อก "ข้อมูลประจำตัว" ที่ "แสดงผล" ข้อมูลใดก็ตามที่ป้อน
คุณสามารถรองรับกรณีนี้ได้ในระดับหนึ่งโดยเปลี่ยนการตรวจสอบการเชื่อมต่อในเอาต์พุตของบล็อกให้ตรงกับอินพุต ซึ่งคุณทําได้โดยใช้ระบบเหตุการณ์เพื่อรับฟังเหตุการณ์การย้ายบล็อก
Blockly.Blocks['custom_block'] = {
init: function() { }
onchange: function(e) {
if (e.type !== Blockly.Events.BlockMove) return;
this.setOutput(
true, this.getInputTargetBlock()?.outputConnection.getCheck());
}
}
แต่หากบล็อกที่เชื่อมต่อเป็นบล็อกทั่วไปด้วย การดำเนินการนี้จะทำงานไม่ถูกต้อง ในกรณีนี้ยังไม่มีวิธีแก้ปัญหาที่ได้ผล
ตัวตรวจสอบการเชื่อมต่อ
หากระบบนี้ใช้ไม่ได้กับกรณีการใช้งานของคุณ คุณยังเปลี่ยนวิธีเปรียบเทียบการตรวจสอบการเชื่อมต่อได้ด้วยการสร้างเครื่องมือตรวจสอบการเชื่อมต่อที่กําหนดเอง
เช่น หากต้องการสร้างระบบขั้นสูงขึ้นที่จัดการข้อจํากัดบางอย่างของระบบนี้ คุณสามารถสร้างโปรแกรมตรวจสอบการเชื่อมต่อที่กําหนดเองได้