新闻详情

新闻详情

首页 / 资讯中心 / 详情

ng-zorro-antd Code Editor 运行时配置修改完全指南:NzConfigService 动态改主题与全局默认项

发布时间:2026/9/25 6:54:25来源:尧图网络
ng-zorro-antd Code Editor 运行时配置修改完全指南:NzConfigService 动态改主题与全局默认项
UI组件前端【免费下载链接】ng-zorro-antdAngular UI Component Library based on Ant Design项目地址https://gitcode.com/gh_mirrors/ng/ng-zorro-antd点击查看免费下载导读本文围绕 ng-zorro-antd 中基于 monaco-editor 的nz-code-editor组件components/code-editor讲解如何在应用运行时动态修改代码编辑器的默认配置与页面内单个编辑器实例的配置。你将掌握NzConfigService.set与getConfigForComponent的使用方式、全局CodeEditorConfig与组件级[nzEditorOption]的合并机制以及用开关控件在明暗主题间热切换的完整实战写法——这部分内容正是官方示例 config.ts 所演示的能力。一、需求背景为什么需要运行时改配置monaco-editor 的诸多能力主题、语言、自动完成、缩进、折叠等在初始化时确定但实际业务中常常需要在不刷新页面的情况下改变这些设置。官方示例 config.md 将其归纳为两类需求修改默认配置即全局默认项defaultEditorOption会影响此后初始化的一切编辑器实例修改页面上编辑器的配置即某个已存在实例自身的[nzEditorOption]。ng-zorro-antd 为此提供了两套机制一套是组件输入[nzEditorOption]作用于单个实例另一套是NzConfigService的全局配置作用于默认项与资源加载。两者最终会在组件内部被合并后统一推送给 monaco。二、先掌握基础两种配置入口1. 组件级配置[nzEditorOption]每个nz-code-editor实例都可以直接传入 monaco 的IEditorConstructionOptionsnormal 模式或IDiffEditorConstructionOptionsdiff 模式相关类型定义见 typings.tstype EditorOptions editor.IStandaloneEditorConstructionOptions; type DiffEditorOptions editor.IDiffEditorConstructionOptions; type JoinedEditorOptions EditorOptions | DiffEditorOptions;典型用法见 basic.tsnz-code-editor classeditor [ngModel]code [nzEditorOption]{ language: typescript } /nzEditorOption以 setter 形式接收新值并写入内部的editorOption$流也就是说运行时替换该输入值即可触发更新code-editor.component.ts。2. 全局配置NzConfigServicecodeEditor命名空间ng-zorro-antd 所有组件共用一个NzConfigServicecomponents/core/configcode-editor 的全局配置类型定义在 config.tsexport interface CodeEditorConfig { assetsRoot?: string | SafeUrl; // monaco 资源根路径默认 assets extraConfig?: NzSafeAny; // 额外传给 window.require.config 的配置 defaultEditorOption?: NzSafeAny; // 全局默认编辑器选项 useStaticLoading?: boolean; // 是否启用静态加载 monacoEnvironment?: MonacoEnvironment;// 全局 MonacoEnvironment 配置 onLoad?(): void; // monaco 资源加载完毕钩子 onFirstEditorInit?(): void; // 第一个编辑器初始化钩子 onInit?(): void; // 每个编辑器初始化钩子 }读取与写入的 APIconst nzConfigService inject(NzConfigService); // 读取某个命名空间下的配置 const cfg nzConfigService.getConfigForComponent(codeEditor); // 写整体替换该命名空间配置推荐先读后合并再写 nzConfigService.set(codeEditor, { ... });三、核心实战运行时切换明暗主题官方示例 config.ts 展示了完整的运行时改配置流程——用nz-switch开关在vs亮色与vs-dark暗色主题之间切换页面上已经渲染好的 markdown 编辑器会立即跟随变化import { Component, inject, signal } from angular/core; import { FormsModule } from angular/forms; import { NzCodeEditorModule } from ng-zorro-antd/code-editor; import { NzConfigService } from ng-zorro-antd/core/config; import { NzIconModule } from ng-zorro-antd/icon; import { NzSwitchModule } from ng-zorro-antd/switch; Component({ selector: nz-demo-code-editor-config, imports: [FormsModule, NzCodeEditorModule, NzIconModule, NzSwitchModule], template: p nz-paragraph stylemargin-bottom: 8px; Change Theme nz-switch [ngModel]dark() (ngModelChange)onDarkModeChange($event) [nzUnCheckedChildren]unchecked [nzCheckedChildren]checked / /p ng-template #unchecked nz-icon nzTypebulb / /ng-template ng-template #checked nz-icon nzTypepoweroff / /ng-template nz-code-editor styleheight: 200px [ngModel]code [nzEditorOption]{ language: markdown } / }) export class NzDemoCodeEditorConfigComponent { private readonly nzConfigService inject(NzConfigService); readonly dark signal(false); readonly code ...你的 markdown 内容...; onDarkModeChange(dark: boolean): void { this.dark.set(dark); const defaultEditorOption this.nzConfigService.getConfigForComponent(codeEditor)?.defaultEditorOption || {}; this.nzConfigService.set(codeEditor, { defaultEditorOption: { ...defaultEditorOption, theme: dark ? vs-dark : vs } }); } }这个写法的关键点先读后写getConfigForComponent(codeEditor)?.defaultEditorOption || {}取出已有默认项避免覆盖此前设置的其他选项浅合并再整体 setset(codeEditor, ...)是整体替换命名空间配置所以必须用展开运算符保留已有字段只需改thememonaco 支持monaco.editor.setTheme()全局换肤暗色/亮色主题的切换成本极低。底层原理配置如何流到 monaco从源码可以看清这条链路code-editor.service.ts服务构造函数读取全局配置并保存为this.config同时用defaultEditorOption初始化内部option$流并注册onConfigChangeEventForComponent(codeEditor, ...)监听配置变更L50-L65一旦配置变化_updateDefaultOption会做两件事把新默认项浅合并进this.option并推入option$如果新配置里带theme还会直接调用monaco.editor.setTheme(option.theme)完成全局换肤L67-L74组件端在registerOptionChanges中combineLatest([editorOption$, option$])把自身选项 全局默认选项按{ ...默认, ...自身 }的顺序合并再通过updateOptions推送给 monaco 实例code-editor.component.ts 与 L314-L318。也就是说NzConfigService.set修改的是默认层[nzEditorOption]修改的是实例层实例层优先级更高最终两者合流后统一生效。示例中页面只放了一个编辑器且没有覆盖 theme因此开关切换主题时所有实例包括未来的新实例都会跟随。四、全局配置的各项能力详解除defaultEditorOption外CodeEditorConfig的其他字段同样可通过NzConfigService在运行时维护官方文档说明index.zh-CN.md与源码实现相互印证配置项作用默认值源码依据assetsRootmonaco 静态资源根路径组件会自动拼接${assetsRoot}/vs/loader.js并注册 AMD 路径assets即assets/vscode-editor.service.tsdefaultEditorOption全局默认编辑器选项会与实例级nzEditorOption合并{}code-editor.service.tsonLoadmonaco 资源加载完成回调此时全局monaco可用-L154-L160onFirstEditorInit第一个编辑器请求初始化时触发只触发一次-L162-L169onInit每个编辑器请求初始化时都触发-L162-L169useStaticLoading使用 webpack 静态打包 monaco不再动态注入脚本falseL83-L91extraConfig透传给window.require.config的扩展配置-L122-L125monacoEnvironment配置window.MonacoEnvironment如 worker 路径-L54-L56关于monacoEnvironment的说明新版 monaco-editor 0.22.0要求使用全局 API 时需要自行声明window.MonacoEnvironment { globalAPI: true }这通常与onLoad钩子配合使用。服务端在构造函数中会把配置里的monacoEnvironment直接挂到window上L54-L56。五、运行时修改单个实例配置[nzEditorOption]的动态更新除了全局默认项你也可以只针对页面上的某一个编辑器实例改配置。由于nzEditorOption是 setter 输入L82-L84运行时替换输入值即可Component({ ... }) export class SomeEditorComponent { editorOption { language: typescript, theme: vs }; switchToDark(): void { this.editorOption { ...this.editorOption, theme: vs-dark }; } }nz-code-editor [ngModel]code [nzEditorOption]editorOption /组件内部会通过combineLatest感知新选项并调用editorInstance.updateOptions(...)增量更新不会重建编辑器实例也不会丢失当前光标与内容。这是实例级热更新与全局默认更新的本质区别——前者只影响这一个实例。六、别忘了资源加载动态加载与静态加载运行时改配置的前提是 monaco 已正确加载官方文档index.zh-CN.md给出的两种方案如下。动态加载默认在angular.json中把 monaco 的vs目录注册为静态资源assets: [ { glob: **/*, input: ./node_modules/monaco-editor/min/vs, output: /assets/vs/ } ]组件会在需要时自动向assets/vs/loader.js发起请求见 loadMonacoScript。若资源放在 CDN则无需改angular.json改为通过NzConfigService设置assetsRoot例如资源位于https://mycdn.com/assets/vs时传入{ assetsRoot: https://mycdn.com/assets }。静态加载当你的应用同时使用 requireJS 等 AMD 加载库时monaco 的 loader.js 会 patch 全局window.require可能产生冲突此时应启用静态加载在app.config.ts中提供NZ_CONFIG并设置codeEditor.useStaticLoading true创建webpack.partial.js按 monaco-editor-webpack-plugin 文档配置打包使用ngx-build-plus等自定义脚本加载器在构建时引入该 webpack 配置。静态加载下无需在angular.json注册资源。源码侧对此有防御当useStaticLoading为真但全局monaco未定义时会输出警告提示 webpack 插件配置可能遗漏L83-L91。七、与运行时配置配套的组件 API在动态配置时你可能还需要操作实例本身nz-code-editor的公开 API 如下详见 index.zh-CN.md输入/输出类型说明[nzEditorMode]normal \| diff编辑器模式默认normal[nzLoading]boolean加载中状态显示内置 loading默认false[nzOriginalText]stringdiff 模式左侧文本[nzFullControl]boolean完全控制模式组件不再管理TextModel默认false[nzEditorOption]IEditorConstructionOptions编辑器选项默认{}[nzToolkit]TemplateRefvoid自定义快捷操作区(nzEditorInitialized)IStandaloneCodeEditor \| IStandaloneDiffEditor初始化完成事件layout()方法强制组件重新渲染如全屏切换后调用其中layout()与运行时配置关系密切窗口resize或容器尺寸变化如 complex.ts 的全屏切换后应手动调用它以触发 monaco 的editor.layout()code-editor.component.ts 与 L199-L220。八、最佳实践小结全局默认项用NzConfigService.set(codeEditor, ...)且务必先getConfigForComponent再展开合并避免误删其他配置单个实例用[nzEditorOption]动态替换优先级高于全局默认项主题切换优先改全局defaultEditorOption.theme底层会走monaco.editor.setTheme对页面上所有实例即时生效diff 模式同理nzEditorModediff时选项类型为IDiffEditorConstructionOptions可参考 diff.ts 的用法全屏、弹窗等尺寸变化场景记得调用layout()否则编辑区可能出现空白或错位若使用完全控制模式[nzFullControl]true组件不再替你管理TextModel需要像 full-control.ts 那样在nzEditorInitialized中自行setModel此时也不要再依赖ngModel双向同步。通过全局默认 实例覆盖双层配置模型你可以在运行时自由调整 ng-zorro-antd 代码编辑器的外观与行为而无需重建页面或重新加载 monaco 资源。赞分享UI组件前端【免费下载链接】ng-zorro-antdAngular UI Component Library based on Ant Design项目地址https://gitcode.com/gh_mirrors/ng/ng-zorro-antd点击查看免费下载相关推荐ng-zorro-antd主题变量动态修改终极指南如何在运行时定制UI界面ng zorro antd主题变量动态修改终极指南如何在运行时定制UI界面 ng zorro antd作为基于Ant Design的Angular UI组件库UI组件前端NG-ZORRO/ng-zorro-antd 主题定制完全指南NG ZORRO/ng zorro antd 主题定制完全指南 前言 NG ZORROAnt Design of Angular作为企业级UI组件库提供了UI组件前端ng-zorro-antd Code Editor 组件完全指南在 Angular 中集成 Monaco Editorng zorro antd Code Editor 组件完全指南在 Angular 中集成 Monaco Editor 导读 本文围绕 ng zorro anUI组件前端上一篇React Native Keyboard Spacer 项目推荐下一篇Egg.js 项目推荐创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

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

较早相关资讯

最新相关资讯

vim全选、全部复制、全部删除:模式与寄存器核心操作详解 2026/9/25 7:30:03

vim全选、全部复制、全部删除:模式与寄存器核心操作详解

刚接触Linux的人,十有八九会在vim里卡住。图形编辑器里CtrlA全选、CtrlC复制、CtrlD删除,一套肌肉记忆带进终端,结果vim愣是没反应。这个场景我见过太多次:有人以为vim坏了,有人干脆放弃,还有人直接在终端里…

阅读更多 →
Laya项目Webpack与ES6兼容性避坑指南 2026/9/25 7:30:03

Laya项目Webpack与ES6兼容性避坑指南

1. 这不是教程,是我在Laya项目里踩了三年坑后写的“避坑地图”你搜“laya入门”时看到的那些文章,大概率会从“LayaAir是什么”开始讲起——它是一个HTML5游戏引擎,支持2D/3D,用TypeScript或JavaScript开发,能导出微信…

阅读更多 →
phpenv搭建PHP多版本管理工具 2026/9/25 7:30:02

phpenv搭建PHP多版本管理工具

phpenv是一个简单易用的PHP版本管理工具,帮助开发者轻松管理多个PHP版本并实现快速切换。如果你需要在同一台机器上测试不同版本的PHP应用程序,phpenv就是你的完美解决方案!🚀为什么选择phpenv?多版本PHP管理变得前所未…

阅读更多 →
VS Code缩进配置失效?4空格统一方案全解析 2026/9/25 7:29:56

VS Code缩进配置失效?4空格统一方案全解析

1. 这不是“改个设置”那么简单:为什么VS Code缩进设为4空格会卡住你整个开发流很多人搜“vscode 设置代码格式化缩进为4个空格”,点开教程照着点几下,发现——代码还是两格、还是tab、还是自动混用、甚至保存后直接崩掉缩进层级。我带过二十…

阅读更多 →
OpenClaw(小龙虾)Win 11 一键部署教程|TaoToken 统一 Key 接入 490+ 大模型全覆盖 2026/9/25 7:29:56

OpenClaw(小龙虾)Win 11 一键部署教程|TaoToken 统一 Key 接入 490+ 大模型全覆盖

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

阅读更多 →
告别刺眼白底:SecureCRT护眼炫酷配色方案与ANSI色板设置指南 2026/9/25 7:29:56

告别刺眼白底:SecureCRT护眼炫酷配色方案与ANSI色板设置指南

用了这么多年SecureCRT,我最看不下去的就是它默认那套白底黑字的配色。每天连着生产环境敲命令,屏幕一亮整个房间都跟着亮,盯久了眼睛又干又涩,别说调试问题,光看日志都觉得费劲。后来痛下决心,花了一个晚上…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

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

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