首页/新闻资讯/正文详情

Blockly 类型化变量模态框插件 @blockly/plugin-typed-variable-modal 集成指南

发布时间:2026/9/23 6:44:05 来源:云帆数科 栏目:资讯中心
Blockly 类型化变量模态框插件 @blockly/plugin-typed-variable-modal 集成指南
Blockly 类型化变量模态框插件 blockly/plugin-typed-variable-modal 集成指南【免费下载链接】blocklyThe web-based visual programming editor.项目地址: https://gitcode.com/gh_mirrors/bl/blockly本指南围绕 Blockly 官方插件 blockly/plugin-typed-variable-modal 展开讲解如何为 Blockly 工作区打造一个创建类型化变量的模态对话框用户点击自定义按钮后弹出对话框输入变量名并从预设类型如 PENGUIN、GIRAFFE中单选一种确认后由插件自动完成变量创建与重名冲突校验。读完本文你将掌握该插件的安装、自定义动态 Flyout 集成、六类消息的国际化定制以及其背后依赖 Blockly 动态变量系统的完整实现原理。插件定位与依赖关系Typed Variable Modal 是 Blockly 生态中的一个官方插件核心能力是为带类型的变量typed variable提供创建入口。与 Blockly 内置的创建变量弹窗不同它允许开发者预先定义一组业务类型如动物、颜色、单位等用户创建变量时必须从中选择一种类型从而在编程积木层面实现类型约束。从 package.json 可以看到它的依赖关系peerDependenciesblockly ^13.2.0即要求宿主应用使用 Blockly 13.2 及以上版本dependenciesblockly/plugin-modal ^13.3.0模态框的基础 UI 能力遮罩、关闭按钮、焦点管理由通用 Modal 插件提供构建与测试基于blockly/dev-scripts、blockly/dev-tools、mocha、sinon、jsdom等。源码入口为 src/index.js它只做了一件事——export * from ./TypedVariableModal核心类TypedVariableModal定义在 src/TypedVariableModal.js该类直接extends Modal来自blockly/plugin-modal并覆写了渲染、确认、清理等关键生命周期方法。安装通过 npm 安装到你的 Blockly 项目npm install blockly/plugin-typed-variable-modal --save该命令会同时安装其依赖blockly/plugin-modal并自动校验 peer 依赖blockly版本是否满足^13.2.0。快速集成从工具箱到弹出模态框插件的集成不是简单实例化一个类而是需要配合Blockly 动态 Flyout自定义工具箱分类一起工作。核心思路是在工具箱中声明一个custom分类用回调动态填充该分类的 Flyout 内容包含一个触发按钮和已有的变量积木再把这个按钮回调与TypedVariableModal绑定。整个流程分为五步。第一步创建工作区import * as Blockly from blockly; import {TypedVariableModal} from blockly/plugin-typed-variable-modal; workspace Blockly.inject(blocklyDiv, { toolbox: toolbox, });第二步在工具箱中添加自定义分类在工具箱 XML或 JSON中声明一个带custom属性的分类custom的值是一个自定义回调名例如CREATE_TYPED_VARIABLEcategory nameColours customCREATE_TYPED_VARIABLE/categorycustom分类的内容完全由注册的回调函数动态生成这是 Blockly 官方文档所述dynamic flyout category的标准用法。第三步定义 Flyout 内容回调回调负责组装该分类在 Flyout 中显示的元素先推入一个按钮再追加Blockly.VariablesDynamic.flyoutCategoryBlocks(workspace)返回的现有变量积木列表const createFlyout function (workspace) { let xmlList []; // Add your button and give it a callback name. const button document.createElement(button); button.setAttribute(text, Create Typed Variable); button.setAttribute(callbackKey, callbackName); xmlList.push(button); // This gets all the variables that the user creates and adds them to the // flyout. const blockList Blockly.VariablesDynamic.flyoutCategoryBlocks(workspace); xmlList xmlList.concat(blockList); return xmlList; };其中button的callbackKey就是后续要注册的按钮回调名下文的callbackName点击该按钮时工作区会调用这个回调名对应的函数。Blockly.VariablesDynamic.flyoutCategoryBlocks定义在 packages/blockly/core/variables_dynamic.ts它遍历workspace.getVariableMap().getAllVariables()按名称排序后为每个变量生成variables_get_dynamic取积木并额外生成一个带 24px 间距的variables_set_dynamic赋值积木。这意味着用户每次通过模态框创建的新变量都会自动出现在该分类的 Flyout 中形成创建即用的闭环。第四步注册工具箱分类回调workspace.registerToolboxCategoryCallback( CREATE_TYPED_VARIABLE, createFlyout, );这里把第二步中customCREATE_TYPED_VARIABLE与第三步的createFlyout函数绑定。第五步创建并初始化 Typed Variable Modalconst typedVarModal new TypedVariableModal(workspace, callbackName, [ [PENGUIN, Penguin], [GIRAFFE, Giraffe], ]); typedVarModal.init();构造函数三个参数的含义如下参数类型说明workspaceBlockly.WorkspaceSvg模态框注册到的工作区btnCallbackNamestring第三步按钮callbackKey对应的回调名init()会把它注册到工作区typesArrayArraystring类型列表每个元素是[显示名, 类型名]例如[[Penguin, PENGUIN]]init()的源码实现见 TypedVariableModal.js非常简洁先调用父类super.init()完成模态框 DOM 初始化再调用this.workspace_.registerButtonCallback(this.btnCallBackName_, () this.show())把按钮回调名绑定到show()。也就是说用户点击 Flyout 里的 Create Typed Variable 按钮时模态框即弹出。核心 API 一览README 中公开的实例 API 及其源码对应关系如下方法作用源码位置init()初始化模态框并注册按钮回调TypedVariableModal.jsdispose()销毁模态框并注销按钮回调TypedVariableModal.jsshow()显示模态框并聚焦第一个可聚焦元素关闭按钮继承自Modalhide()隐藏模态框继承自Modalrender()创建模态框全部 DOM 元素内部由renderContent_()/renderFooter_()组成setLocale(messages)替换模态框文案支持多语言TypedVariableModal.js几个值得注意的实现细节dispose()除了调用super.dispose()释放父类资源外还会调用workspace_.removeButtonCallback(this.btnCallBackName_)注销按钮回调避免工作区残留悬挂引用。show()后焦点落在关闭按钮blocklyModalBtn blocklyModalBtnClose最后可聚焦元素是确认/取消按钮——这是Modal基类内置的焦点圈定逻辑单测 typed_variable_modal_test.mocha.js 对此做了断言。构造函数将this.shouldCloseOnOverlayClick false置为false源码 L101即点击遮罩层不会关闭模态框只能通过右上角X或Esc键关闭防止用户误触丢失输入内容。输入校验与重名冲突处理源码级原理用户点击 Ok 确认后onConfirm_()源码 L170-L200依次执行三段逻辑名称合法性校验getValidInput_()先取输入框值用newVar.replace(/[\s\xa0]/g, ).trim()把连续空白含不间断空格\xa0折叠为单个空格并去除首尾空白如果清洗后的名称恰好等于Blockly.Msg[RENAME_VARIABLE]或Blockly.Msg[NEW_VARIABLE]即重命名变量...、创建变量...等系统占位文案则判定为非法返回null并弹出TYPED_VAR_MODAL_INVALID_NAME提示。跨类型重名检查调用Blockly.Variables.nameUsedWithAnyType(text, workspace)做不区分大小写的全变量名搜索。该函数定义于 packages/blockly/core/variables.ts遍历变量表把所有名称toLowerCase()后比对返回第一个同名变量。分支处理若同名变量类型相同弹出VARIABLE_ALREADY_EXISTSA variable named %1 already exists.若同名变量类型不同弹出VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPEA variable named %1 already exists for another type: %2.其中%2由getDisplayName_()根据[显示名, 类型名]配对反查得到无冲突调用workspace.getVariableMap().createVariable(text, type)真正创建类型化变量并hide()关闭模态框。单测 typed_variable_modal_test.mocha.js 用 sinon stub 覆盖了空名称合法名称同类型已存在不同类型已存在四条路径可作为理解该逻辑的参考。类型列表types详解types参数是ArrayArraystring每个子数组形如[displayName, typeName]displayName索引 0是展示给用户的类型名称显示在单选按钮旁边的label中typeName索引 1是写入变量模型的真实类型标识同时用作单选按钮的id即selectedType_的值。源码createVariableTypeContainer_()L314-L340会为每个类型生成一个li内含typeradio、nameblocklyVariableType的单选按钮及for指向该 id 的label点击任一选项时selectedType_被更新为该选项的 id。模态框每次打开时resetModalInputs_()会自动勾选第一个类型并清空变量名输入框保证干净的输入状态。由于单选按钮 id 直接使用类型名建议类型名保持唯一且不含空格等特殊字符避免 HTML id 冲突。国际化与消息定制插件目前不提供内置的多语言翻译但 README 明确说明可通过typedVarModal.setLocale(messages)传入翻译后的消息对象来实现多语言支持。setLocale()的实现是把每个 key 直接写入全局的Blockly.Msg源码 L132-L136因此后续渲染的按钮、标签、标题都会使用新文案构造函数内部也有一份英文默认值并通过Object.assign(messages, optMessages)合并用户传入的第四参optMessages。需要翻译的 6 个消息 key 及默认值如下Key默认值英文用途TYPED_VAR_MODAL_CONFIRM_BUTTONOk确认按钮文字TYPED_VAR_MODAL_VARIABLE_NAME_LABELVariable Name:变量名输入框前的标签TYPED_VAR_MODAL_TYPES_LABELVariable Types类型区块的标题TYPED_VAR_MODAL_CANCEL_BUTTONCancel取消按钮文字TYPED_VAR_MODAL_TITLECreate Typed Variable模态框标题TYPED_VAR_MODAL_INVALID_NAMEName is not valid. Please choose a different name.非法名称提示名称等于重命名/新建变量的系统文案、或为空字符串时触发例如切换到中文typedVarModal.setLocale({ TYPED_VAR_MODAL_CONFIRM_BUTTON: 确定, TYPED_VAR_MODAL_CANCEL_BUTTON: 取消, TYPED_VAR_MODAL_TITLE: 创建类型化变量, TYPED_VAR_MODAL_VARIABLE_NAME_LABEL: 变量名称, TYPED_VAR_MODAL_TYPES_LABEL: 变量类型, TYPED_VAR_MODAL_INVALID_NAME: 名称无效请选择其他名称。, });单测 typed_variable_modal_test.mocha.js 验证了setLocale()会正确写入Blockly.Msg。样式与 DOM 结构插件通过Blockly.Css.register(...)在导入时注入内置样式源码 L370-L391因此无需额外引入 CSS 文件。关键样式类包括.typedModalTitle模态框标题加粗.typedModalVariableInputContainer/.typedModalVariableLabel/.typedModalVariableNameInput变量名输入区.typedModalTypes类型区块使用display: flex; flex-wrap: wrap让类型单选列表横向换行排列.typedModalList li每个类型项margin-right: 1em分隔。DOM 结构由renderContent_()变量名输入区 类型列表与renderFooter_()确认 取消两个按钮分别带blocklyModalBtn blocklyModalBtnPrimary与blocklyModalBtn类构成单测 render 套件 断言了这些节点与按钮数量。本地开发与测试仓库内提供了完整的测试与演示环境测试入口test/typed_variable_modal_test.mocha.js 使用 mocha jsdom sinon覆盖init、show焦点、setLocale、onConfirm_四分支、getDisplayName_、getValidInput_、render、按钮与容器创建等全部核心逻辑演示页面test/index.js 通过blockly/dev-tools的createPlayground搭建交互 playground并把Typed Variables自定义分类注入toolboxCategories运行npm test内部调用blockly-scripts test见 package.json即可构建并打开 test/index.html 实际操作。许可证本插件采用 Apache 2.0 许可证见 README 与源码文件头SPDX-License-Identifier: Apache-2.0可自由用于商业与开源项目。【免费下载链接】blocklyThe web-based visual programming editor.项目地址: https://gitcode.com/gh_mirrors/bl/blockly创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

逝者已矣手写完整示例:3步调通复制代码
逝者已矣手写完整示例:3步调通复制代码

逝者已矣手写完整示例:3步调通复制代码 刚把网上抄的“逝者已矣”逻辑扔进工程里,直接报空指针。别慌,这种复制来的代码跑不通不知道怎么调的情况太常见了。很多人卡在变量作用域和生命周期上,以为逻辑通就行,结果运行时崩了。今天咱们不整虚的,直接给… · 2026/9/23 6:44:05

routersploit Cisco 路由器 FTP 默认凭据字典攻击模块实战指南
routersploit Cisco 路由器 FTP 默认凭据字典攻击模块实战指南

routersploit Cisco 路由器 FTP 默认凭据字典攻击模块实战指南 【免费下载链接】routersploit Exploitation Framework for Embedded Devices 项目地址: https://gitcode.com/gh_mirrors/ro/routersploit 导读 本文围绕 routersploit 项目中的 creds/routers/cisco/ftp… · 2026/9/23 6:44:04

大模型时代算法工程师的技术栈与职业发展
大模型时代算法工程师的技术栈与职业发展

1. 行业现状:算法工程师为何成为黄金职业2023年被称为AI大模型爆发元年,ChatGPT的横空出世彻底改变了技术人才市场的供需格局。根据某头部招聘平台最新数据显示,北上广深算法工程师岗位平均月薪已突破6万元,部分AIGC方向资深工程师… · 2026/9/23 6:43:46

Java Fork/Join框架:多核时代的并行计算利器
Java Fork/Join框架:多核时代的并行计算利器

1. Fork/Join框架的核心价值与应用场景在现代多核处理器成为标配的硬件环境下,如何充分发挥硬件潜力是每个Java开发者必须掌握的技能。Fork/Join框架作为Java 7引入的并发工具,专为可分解的计算密集型任务设计,其性能表现往往能比传统线程池高… · 2026/9/23 7:34:46

从单张图像到SMPL:2D/3D关键点估计与姿态拟合的完整工程实践
从单张图像到SMPL:2D/3D关键点估计与姿态拟合的完整工程实践

简介:面向计算机视觉与三维姿态估计学习者的实战项目,针对从单一彩色图像提取2D3D人体关键点并与SMPL模型对齐这一任务,提供完整的代码工程与使用说明。项目覆盖二维关键点检测、三维空间映射、SMPL参数适配等核心环节,适合希望深… · 2026/9/23 7:34:46

法学生必看✅法律论文降重,绝对不能瞎改法理逻辑
法学生必看✅法律论文降重,绝对不能瞎改法理逻辑

法学、经济法、民商法、刑法、行政法、诉讼法、法律专硕JM的同学全员共情! 法学是所有专业里降重容错率最低、最容易出现学术硬伤的专业!没有之一! 整篇论文核心全是:法律条文援引、法理逻辑阐释、司法判例分析、法律制度剖析、… · 2026/9/23 7:34:40

V100 16GB跑Qwen 27B:从4到64 tok/s的调优实战
V100 16GB跑Qwen 27B:从4到64 tok/s的调优实战

1. 一块老卡能跑大模型吗?先聊聊这次调优的背景先交代一下手头的硬件。V100 这张卡,放到 2024 年底、2025 年初的语境里已经很“复古”了——16GB 显存、不支持 BF16 加速、没有 INT8 Tensor Core 的那些新特性,算力放在今天也不算顶尖。但你… · 2026/9/23 7:34:39

Python魔术方法核心详解:从基础协议到实战应用
Python魔术方法核心详解:从基础协议到实战应用

我最早接触Python的时候,最困惑的就是那些前后夹着双下划线的方法名,比如__init__、__str__、__getitem__。当时看教程说“魔术方法是Python的灵魂”,说实话没太当回事,直到后来读一些第三方库的源码,才发现不懂魔术方… · 2026/9/23 7:34:39

3个实战项目搞懂动画美女核心逻辑,面试不再挂
3个实战项目搞懂动画美女核心逻辑,面试不再挂

3个实战项目搞懂动画美女核心逻辑,面试不再挂 看了一堆教程还是不会写项目?别急,这不是你的错,是教程太碎。 很多开发者在掘金技术社区发帖吐槽:学了CSS动画、GSAP、Lottie,结果一到 实战项目 就懵圈,不知道哪个该用,性能还炸。… · 2026/9/23 7:34:39

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码