新闻详情

新闻详情

首页 / 资讯中心 / 详情

CesiumJS 自定义 Widget 开发教程:源码走读后落地的 5 个可复用决策点

发布时间:2026/9/11 15:24:00来源:尧图网络
CesiumJS 自定义 Widget 开发教程:源码走读后落地的 5 个可复用决策点
CesiumJS 自定义 Widget 开发教程源码走读后落地的 5 个可复用决策点【免费下载链接】cesiumAn open-source JavaScript library for world-class 3D globes and maps :earth_americas:项目地址: https://gitcode.com/GitHub_Trending/ce/cesium做三维 GIS 的同学多半都碰到过这个卡点Cesium 官方工具栏能看不能改一到业务就得往 Viewer 里塞自己的控制面板。CesiumJS 自定义 Widget 这条路我翻了 Cesium 仓库里 Geocoder 和 Viewer 的源码后才想明白——它的组织方式和很多人直觉里的 React 组件并不一样。与其背概念不如直接拆一个官方现成的 Widget把哪些能复用、哪些必须自己重写摸清楚。下面按调研、设计、实现、收尾的顺序把一个场景巡检面板真正挂进 Viewer。从 Geocoder 拆一个 Widget 的真实解剖结构官方每个 Widget 都是一个文件夹 一个 View 一个 ViewModel 一个 CSS。拿 Geocoder 举例Geocoder.js只干三件事——拼 DOM、写data-bind、applyBindings真正的状态和逻辑全在GeocoderViewModel.js里。这个拆分不是为了好看而是让界面长什么样和状态怎么变解耦。你改 UI 时不会碰坏业务逻辑反过来调逻辑也不该回头动 DOM。View 与 ViewModel 是怎么分开的ViewGeocoder.jscreateElement拼结构setAttribute(data-bind, ...)写绑定knockout.applyBindings(viewModel, node)收尾。它不写业务只负责把命令接到 DOM 上。ViewModelGeocoderViewModel.js持有_searchText、_suggestions这些可观察状态暴露searchCommanddestroy()负责清场。依赖方向是单向的View 引用 ViewModelViewModel 不知道 DOM 长啥样。这和组件库里props 下行、事件上行是同一思路只是用 Knockout 的 observable 实现响应式。createCommand 把按钮变成命令你大概率不会直接给按钮绑onClick而是用createCommand(func, canExecute)包一层。它额外挂了beforeExecute、afterExecute两个Event还能在canExecute为false时拒绝执行。好处在于Viewer 里可以用eventHelper.add(homeButton.viewModel.command.afterExecute, ...)旁听一个按钮的行为而按钮自己完全不用知道有没有人听。这就是为什么官方敢让 HomeButton 和 Geocoder 互相联动——命令成了可插拔的接缝。Viewer 的扩展点到底在哪里很多人第一反应是找viewer.extend()但当前源码里没有这个 API。真实的挂接点在 Viewer 构造函数里它先 new 出一个toolbar容器再把 Geocoder、HomeButton 逐个appendChild进去同时用this._eventHelper.add(scene.postUpdate, ...)订阅帧事件。你要做的扩展本质是复刻建容器 → 实例化 → 挂订阅这套流程只是把对象换成自己的。为什么强调eventHelper而不是裸addEventListener因为EventHelper是一份订阅清单destroy时一次性removeAll()就干净了裸add的监听你得自己记着哪条加在哪、再逐条remove漏一条就是内存泄漏。Cesium 的 Widget 常会反复创建销毁这点很致命。给自己的巡检面板定一个最小骨架需求别贪先只放一个开关加一段状态文案。骨架分两层容器决定往哪塞状态决定变了之后 UI 怎么跟。function ScenePanelViewModel(options) { this._scene options.scene; this.showGrid false; // 可观察状态 this.statusText 待命; knockout.track(this, [showGrid, statusText]); this.toggleGrid createCommand(() { this.showGrid !this.showGrid; this.statusText this.showGrid ? 网格开启 : 网格关闭; this._scene.globe.showGroundAtmosphere this.showGrid; // 状态落到 scene }); }先定容器再定状态容器一个divclassName走cesium-viewer-前缀好蹭官方 CSS 变量做主题。状态只留两个最小可观察属性showGrid、statusText其余随需求再长。命令一个toggle改状态 落到scene上。原则是状态先行DOM 跟着状态走。把顺序反过来先写一堆 DOM 回调后面加状态就得回头改回调组件化就名存实亡了。注册与销毁哪些引用必须清理这是最容易翻车、也最能拉开质量差距的一段。挂进去和拆出来必须对称。挂进去与拆出来的对称写法// 占一个位再实例化自己的 Widget const box document.createElement(div); box.className cesium-viewer-scenePanel; viewer._toolbar.appendChild(box); const panel new ScenePanel({ container: box, scene: viewer.scene }); viewer._eventHelper.add(scene.postUpdate, panel.onFrame, panel); // 订阅帧destroy 里要清掉的四类东西外部监听挂在document/scene上的removeEventListener以及eventHelper的订阅。Knockout 绑定knockout.cleanNode(node)否则 observable 还追着已删的 DOM。自建 DOMcontainer.removeChild(...)。自身对象return destroyObject(this)交给框架回收。顺序建议先解外部、再清内部避免解绑时回调又访问到已清掉的节点。让组件复用的 3 个习惯命名加前缀CSS 用cesium-viewer-scenePanel-*JS 状态用_开头私有字段避免和官方工具栏撞名。命令化一切交互把点击都换成createCommand将来要联动、要拦截时不用改调用方。容器参数化构造只吃{ container, scene, ...options }不写死 id一个实例能挂到任意位置。想继续挖官方把每个 Widget 都拆成独立目录摆在这packages/widgets/Source/动手前过一遍风格约定能少挨不少 reviewDocumentation/Contributors/CodingGuide/。下一步试着只改container参数把巡检面板从工具栏挪到左下角别动内部逻辑——如果挪动时没改任何状态代码说明拆分是真的解耦了。【免费下载链接】cesiumAn open-source JavaScript library for world-class 3D globes and maps :earth_americas:项目地址: https://gitcode.com/GitHub_Trending/ce/cesium创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

YOLOv8定制化缩痕检测:工业注塑件微缺陷识别实战 2026/9/11 16:06:08

YOLOv8定制化缩痕检测:工业注塑件微缺陷识别实战

简介:本资源是一套面向计算机视觉初学者与高校学生的工业缺陷检测实战项目,聚焦注塑件缩痕这一典型制造缺陷,基于YOLOv8构建端到端检测系统,适用于毕业设计、课程设计及AI工程入门实践。资源包含完整可运行源码、标注规范的工业级…

阅读更多 →
基于PyTorch的语音识别课程设计:从特征提取到CTC模型完整实现 2026/9/11 16:06:08

基于PyTorch的语音识别课程设计:从特征提取到CTC模型完整实现

简介:这是一份面向课程设计、毕业设计及期末大作业的深度学习语音识别Python源码与配套文档说明,适合具备Python和神经网络基础、需要完整工程参考的学生。压缩包共八十八个文件,以三十个Python脚本、二十九个txt文本、二十二个lst列表为主&a…

阅读更多 →
Cloudflare C3(create-cloudflare)CLI 完全参考:命令调用、核心参数与 CI/CD 实战指南 2026/9/11 16:06:08

Cloudflare C3(create-cloudflare)CLI 完全参考:命令调用、核心参数与 CI/CD 实战指南

Cloudflare C3(create-cloudflare)CLI 完全参考:命令调用、核心参数与 CI/CD 实战指南 【免费下载链接】skills Skills Catalog for Codex 项目地址: https://gitcode.com/GitHub_Trending/skills4/skills 本指南以 skills/.curated/c…

阅读更多 →
Actual Budget 25.9.0 版本解析:移动端规则管理、Pluggy.ai 银行连接与自动化后端落地 2026/9/11 16:06:08

Actual Budget 25.9.0 版本解析:移动端规则管理、Pluggy.ai 银行连接与自动化后端落地

Actual Budget 25.9.0 版本解析:移动端规则管理、Pluggy.ai 银行连接与自动化后端落地 【免费下载链接】actual A local-first personal finance app 项目地址: https://gitcode.com/GitHub_Trending/ac/actual Actual 25.9.0 是 Actual Budget(本…

阅读更多 →
SpringBoot整合ONLYOFFICE实现文档实时协作 2026/9/11 16:06:08

SpringBoot整合ONLYOFFICE实现文档实时协作

1. 为什么要在SpringBoot中整合ONLYOFFICE?在企业级应用开发中,文档协作是个硬需求。传统做法是让用户下载文档→本地编辑→重新上传,这个流程既繁琐又容易产生版本混乱。ONLYOFFICE作为一款开源的在线Office套件,能直接在浏览器里…

阅读更多 →
WSL2 + Docker Desktop 在 Windows 上部署 MySQL 等中间件实战指南 2026/9/11 16:03:06

WSL2 + Docker Desktop 在 Windows 上部署 MySQL 等中间件实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞