自訂構成要素:區塊典範

設計應用程式時,您可以從幾種模式中選擇 它會使用 Blockly慎重考慮這些資訊 因為會影響使用者需要的封鎖

設定

許多 Blockly 應用程式都會用於描述設定 而非可執行程式設定應用程式的一開始 將一個根層級區塊初始化到工作區以下何者是良好範例: Blockly 開發人員工具的「Block Factory」分頁:

Blockly.Blocks['factory_base'] = {
  init: function() {
    this.setDeletable(false);
    this.setMovable(false);
    this.setEditable(false);
    // etc...
  }
}

Blockly.serialization.blocks.append({'type': 'factory_base'}, workspace);

這會建立一個不可移動的不可移動區塊,容納所有 變更組態您可以隨時序列化工作區 判斷目前的設定

這類應用程式可能希望自動停用所有 均已連線至根區塊您可以用一行程式碼完成此操作:

workspace.addChangeListener(Blockly.Events.disableOrphans);

系列節目

大多數 Blockly 應用程式的設計都是為了建立序列 計畫。系統會將使用者堆疊在一起,系統會按照順序執行。

工作區中的每個 (非停用) 區塊都會成為 計畫。如果有多個區塊堆疊,越多區塊 執行狀態(如果兩個堆疊的高度大致相同, 系統會指定堆疊至左側 (在 RTL 模式中)。

您隨時可以將工作區匯出至可執行的程式碼。這組代碼 可以在 JavaScript 的用戶端中執行 (使用 eval 或 JS 翻譯版) 或伺服器端檔案 (不限語言)。

import {javascriptGenerator} from 'blockly/javascript';

var code = javascriptGenerator.workspaceToCode(workspace);

平行計畫

有些 Blockly 應用程式選擇執行 平行,而非依序執行例如音樂應用程式 就是鼓組與旋律同時演奏

為 個別封鎖:

import {javascriptGenerator} from 'blockly/javascript';

var json = Blockly.serialization.workspaces.save(workspace);

// Store top blocks separately, and remove them from the JSON.
var blocks = json['blocks']['blocks'];
var topBlocks = blocks.slice();  // Create shallow copy.
blocks.length = 0;

// Load each block into the workspace individually and generate code.
var allCode = [];
var headless = new Blockly.Workspace();
for (var i = 0; block < topBlocks.length; i++) {
  var block = topBlocks[i];
  blocks.push(block);
  Blockly.serialization.workspaces.load(json, headless);
  allCode.push(javascriptGenerator.workspaceToCode(headless));
  blocks.length = 0;
}

如果指定語言是 JavaScript,則 allCode 陣列可能會 來建立多個 JS 解譯器,以便同時執行。如果 目標語言就像 Python,然後 allCode 陣列 可能會組合成使用執行緒模組的單一程式。

與任何平行程式一樣,必須審慎決定 任何共用資源,例如變數和函式

活動導向計畫

事件處理常式只是系統呼叫的函式 比程式更升級這些區塊可以包住 要執行的區塊,或者這些區塊可能位於堆疊之上的標頭 方塊。

有些開發人員喜歡加入事件區塊的頂端 它們看起來就會與其他方塊區隔開來這不是 的預設外觀 會封鎖,但可以透過覆寫轉譯器常數來新增 ADD_START_HATStrue (自訂轉譯器程式碼研究室 - 覆寫常數)。 或是加入主題 並針對方塊樣式設定帽子選項更多內容 若要瞭解如何在主題中設定帽子的帽子,請參閱相關文章 請按這裡

在事件導向模式中,同時建立處理常式也很合理 計畫開始執行在這個模型中,工作區的任何區塊都不會 系統將忽略且不會執行連線至事件處理常式。

設計使用事件的系統時,請考慮 支援多個同一事件的多個例項 處理常式。