高级自定义

Blockly 可让您通过替换相应的 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 配置选项注入替换类。这是一个使用注册表类型名称作为属性名称,并使用替换类或注册名称作为属性值的对象。

(尽管 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'
  }
}