Tính năng kiểm tra kết nối sẽ hạn chế những kết nối (và do đó là các khối) có thể kết nối với nhau.
Tính năng kiểm tra kết nối rất hữu ích cho các loại mô hình. Ví dụ: 3 khối sau đây không có liên quan gì với nhau vì chúng đại diện cho mã trả về các loại khác nhau:
Bạn có thể sử dụng tính năng kiểm tra kết nối để ngăn các khối này kết nối. Điều này giúp người dùng nhận được phản hồi tức thì và tránh được nhiều lỗi đơn giản.
Cách hoạt động
Mỗi kết nối có thể được liên kết với một "quy trình kiểm tra kết nối", đây là một mảng chuỗi rỗng.
Hai kết nối có thể kết nối nếu:
- Đây là các loại tương thích (ví dụ: đầu ra kết nối với đầu vào).
- Các chuỗi này có ít nhất một chuỗi chung trong quy trình kiểm tra kết nối.
Ví dụ: các kết nối có hai bước kiểm tra sau đây có thể kết nối với nhau vì các kết nối này dùng chung chuỗi 'apple'
:
['apple', 'ball', 'cat']
['apple', 'bear', 'caterpillar']
Tuy nhiên, các kết nối với hai lượt kiểm tra này không thể kết nối vì chúng không chia sẻ bất kỳ chuỗi nào:
['apple', 'ball', 'cat']
['ape', 'bear', 'caterpillar']
Còn một trường hợp đặc biệt khác. Nếu một trong hai mảng là null
, thì hai kết nối này cũng có thể kết nối. Điều này cho phép bạn xác định các kết nối có thể kết nối với bất kỳ nội dung nào.
null
['ape', 'bear', 'caterpillar]
Ví dụ
Để biết danh sách ví dụ về cách sử dụng tính năng kiểm tra kết nối, hãy xem Hướng dẫn sử dụng tính năng kiểm tra kết nối.
Đặt các bước kiểm tra
Theo mặc định, tất cả các kết nối đều có tính năng kiểm tra kết nối null
, nghĩa là chúng có thể kết nối với bất kỳ nội dung nào. Bạn cần chỉ định việc kiểm tra kết nối theo cách thủ công.
Cách bạn chỉ định các hoạt động kiểm tra kết nối cho các kết nối sẽ khác nhau tuỳ thuộc vào việc bạn đang sử dụng định nghĩa khối JSON hay định nghĩa khối JavaScript.
JSON
Đối với các kết nối cấp cao nhất, bạn chỉ định việc kiểm tra trực tiếp cho thuộc tính xác định kết nối. Giá trị bạn chỉ định có thể là null
, một chuỗi (trở thành mục nhập duy nhất trong quy trình kiểm tra kết nối) hoặc một mảng chuỗi.
{
'type': 'custom_value_block',
'output': 'a connection check entry',
},
{
'type': 'custom_statement_block',
'nextStatement': null, // null check
'previousStatement': ['four', 'connection', 'check', 'entries']
}
Đối với dữ liệu đầu vào, bạn có thể chỉ định việc kiểm tra cho thuộc tính check
của định nghĩa dữ liệu đầu vào. Nếu thuộc tính check
không tồn tại, thì thao tác kiểm tra sẽ được coi là null
. Giá trị bạn chỉ định có thể là một chuỗi hoặc một mảng chuỗi.
{
'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
Đối với các kết nối cấp cao nhất, bạn có thể chuyển trực tiếp quy trình kiểm tra đến phương thức xác định kết nối. Nếu bạn không truyền giá trị, thì thao tác kiểm tra sẽ được coi là null
. Giá trị bạn truyền có thể là một chuỗi (trở thành mục nhập duy nhất trong quy trình kiểm tra kết nối) hoặc một mảng chuỗi.
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']);
}
};
Đối với dữ liệu đầu vào, bạn có thể chuyển quy trình kiểm tra đến phương thức setCheck
sau khi đã xác định dữ liệu đầu vào. Nếu phương thức setCheck
không được gọi, thì thao tác kiểm tra sẽ được coi là null
. Giá trị bạn truyền có thể là một chuỗi hoặc một mảng chuỗi.
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
}
};
Chuỗi kiểm tra tích hợp sẵn
Các khối tích hợp có các bước kiểm tra kết nối với các giá trị 'Array'
, 'Boolean'
, 'Colour'
, 'Number'
và 'String'
. Nếu muốn các khối của mình tương tác với các khối tích hợp, bạn có thể sử dụng các giá trị này để giúp các khối tương thích với nhau.
Các điểm hạn chế
Hệ thống này khá mạnh mẽ và có thể giải quyết nhiều trường hợp sử dụng, nhưng cũng có một số hạn chế.
Hạn chế ngữ cảnh lớn hơn
Hệ thống này tự nó không hỗ trợ việc hạn chế "ngữ cảnh lớn hơn" mà một kết nối được phép kết nối. Ví dụ: bạn không thể nói rằng khối break
chỉ được phép tồn tại bên trong khối loop
. Hệ thống kiểm tra kết nối chỉ xem xét hai kết nối sắp kết nối.
Bạn có thể hỗ trợ việc này bằng cách sử dụng hệ thống sự kiện để theo dõi các sự kiện di chuyển khối và kiểm tra xem khối có được định vị chính xác hay không.
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;
},
}
Kiểu chung
Hệ thống này tự nó không hỗ trợ việc xác định các loại chung. Ví dụ: bạn không thể tạo một khối "Identity" (Giá trị nhận dạng) "trả về" bất kỳ giá trị đầu vào nào.
Bạn có thể một phần hỗ trợ việc này bằng cách chủ động thay đổi quy trình kiểm tra kết nối trên đầu ra của khối để khớp với đầu vào của khối. Bạn có thể thực hiện việc này bằng cách sử dụng hệ thống sự kiện để nghe các sự kiện chặn di chuyển.
Blockly.Blocks['custom_block'] = {
init: function() { }
onchange: function(e) {
if (e.type !== Blockly.Events.BlockMove) return;
this.setOutput(
true, this.getInputTargetBlock()?.outputConnection.getCheck());
}
}
Tuy nhiên, nếu khối được kết nối cũng là chung, thì cách này sẽ không hoạt động đúng cách. Không có giải pháp nào phù hợp cho trường hợp này.
Trình kiểm tra kết nối
Nếu hệ thống này không phù hợp với trường hợp sử dụng của bạn, bạn cũng có thể thay đổi cách so sánh các lần kiểm tra kết nối bằng cách tạo một trình kiểm tra kết nối tuỳ chỉnh.
Ví dụ: nếu muốn tạo một hệ thống nâng cao hơn để xử lý một số hạn chế của hệ thống này, bạn có thể tạo một trình kiểm tra kết nối tuỳ chỉnh.