進階自訂

您可以替換對應的 Blockly 類別,自訂特定功能。

可替換的類別

可以取代的 Blockly 類別如下:

Blockly 類別 介面 登錄類型名稱
Blockly.dragging.Dragger Blockly.IDragger blockDragger
Blockly.ConnectionChecker Blockly.IConnectionChecker connectionChecker
Blockly.InsertionMarkerPreviewer Blockly.IConnectionPreviewer connectionPreviewer
Blockly.HorizontalFlyout Blockly.IFlyout flyoutsHorizontalToolbox
Blockly.VerticalFlyout Blockly.IFlyout flyoutsVerticalToolbox
Blockly.MetricsManager Blockly.IMetricsManager metricsManager
Blockly.Toolbox Blockly.IToolbox toolbox
Blockly.VariableMap Blockly.IVariableMap variableMap
Blockly.VariableModel Blockly.IVariableModel --

如要瞭解如何取代算繪器,請參閱「建立自訂算繪器」。

建立替代類別

如要建立替代類別,請實作對應介面中的函式。您可以在新類別中實作所有這些函式,也可以擴充 Blockly 類別,並只覆寫要變更的函式。唯一的要求是您 (或基底類別) 必須實作介面中的所有函式,並遵守介面註解中說明的任何規定。

如要向型別檢查程式指出您實作特定介面,請使用 @implements {InterfaceName} JSDoc 標記 (在 JavaScript 中) 或 implements 關鍵字 (在 TypeScript 中) 註解類別。

向 Blockly 說明替代類別

您可以透過兩種方式告知 Blockly 替代類別:將其註冊為該類型的預設類別 (建議),或使用 plugins 設定選項注入。

將替代類別註冊為預設類別

如要向 Blockly 說明替代類別,建議您將其註冊為該類型的預設值。如要執行此操作,請使用名稱 Blockly.registry.DEFAULT 呼叫 Blockly.registry.register,並將 opt_allowOverrides 參數設為 true

Blockly.registry.register(
  Blockly.registry.Type.VARIABLE_MODEL,
  Blockly.registry.DEFAULT,
  CustomVariableModel,
  true,
);

插入替代類別

您也可以使用 plugins configuration option 插入替代類別。 這個物件會使用登錄型別名稱做為屬性名稱,並使用替代類別或已登錄的名稱做為屬性值。

(雖然 plugins 屬性的名稱與用於擴充 Blockly 的外掛程式類似,但您的類別不需要透過 npm 封裝及發布。)

將替代類別傳遞至 Blockly.inject

Blockly.inject('blocklyDiv', {
  plugins: {
    'metricsManager': CustomMetricsManagerClass
  }
}

或者,使用 Blockly.registry.register 註冊類別,並將註冊名稱傳遞至 Blockly.inject。如果您將設定選項儲存為純 JSON,這項功能就非常實用。

Blockly.registry.register(Blockly.registry.Type.METRICS_MANAGER, 'YOUR_NAME', CustomMetricsManagerClass);

Blockly.inject('blocklyDiv', {
  plugins: {
    'metricsManager': 'YOUR_NAME'
  }
}