在 Angular 13 中实现 Monaco 编辑器

2023-12-24

在 Angular 13 中实现 Monaco 编辑器的最佳选择是什么? 我见过 ngx-monaco-editor,但上次更新是 9 个月,它已经升级到 Angular 12,Monaco 版本也有 0.20.0 (11.02.2020),非常旧:( 在 Angular 13 中还有其他使用它的方法吗?


这就是我解决这个问题的方法,很大程度上受到 atularen/ngx-monaco-editor 的启发。但我也不想依赖这种依赖。可能有更好的解决方案。

npm install monaco-editor

角度.json:

            "assets": [
              ...
              {
                "glob": "**/*",
                "input": "node_modules/monaco-editor",
                "output": "assets/monaco-editor"
              }
            ],

摩纳哥编辑服务.ts:

import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';

@Injectable({
  providedIn: 'root',
})
export class MonacoEditorService {
  loaded: boolean = false;

  public loadingFinished: Subject<void> = new Subject<void>();

  constructor() {}

  private finishLoading() {
    this.loaded = true;
    this.loadingFinished.next();
  }

  public load() {
    // load the assets

    const baseUrl = './assets' + '/monaco-editor/min/vs';

    if (typeof (<any>window).monaco === 'object') {
      this.finishLoading();
      return;
    }

    const onGotAmdLoader: any = () => {
      // load Monaco
      (<any>window).require.config({ paths: { vs: `${baseUrl}` } });
      (<any>window).require([`vs/editor/editor.main`], () => {
        this.finishLoading();
      });
    };

    // load AMD loader, if necessary
    if (!(<any>window).require) {
      const loaderScript: HTMLScriptElement = document.createElement('script');
      loaderScript.type = 'text/javascript';
      loaderScript.src = `${baseUrl}/loader.js`;
      loaderScript.addEventListener('load', onGotAmdLoader);
      document.body.appendChild(loaderScript);
    } else {
      onGotAmdLoader();
    }
  }
}

现在打电话摩纳哥编辑服务.load(),只要您需要编辑器(在我的例子中,它在构造函数中的 app.component.ts 中调用,以使编辑器始终可用并已预加载)。

现在,您可以根据需要创建编辑器,但请确保在加载 Monaco 之前不要创建它们。像这样:

摩纳哥编辑器.component.ts

import ...

declare var monaco: any;

@Component({
  selector: 'app-monaco-editor',
  templateUrl: './monaco-editor.component.html',
  styleUrls: ['./monaco-editor.component.scss'],
})
export class MonacoEditorComponent implements OnInit, OnDestroy, AfterViewInit {
  public _editor: any;
  @ViewChild('editorContainer', { static: true }) _editorContainer: ElementRef;

  private initMonaco(): void {
    if(!this.monacoEditorService.loaded) {
      this.monacoEditorService.loadingFinished.pipe(first()).subscribe(() => {
        this.initMonaco();
      });
      return;
    }

    this._editor = monaco.editor.create(
      this._editorContainer.nativeElement,
      options
    );
  }

  ngAfterViewInit(): void {
    this.initMonaco();
  }

很可能有比布尔标志和这个主题更优雅的解决方案。

摩纳哥-editor.component.html

确保组件中有一个 div,如下所示:

<div class="editor-container" #editorContainer></div>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Angular 13 中实现 Monaco 编辑器 的相关文章

随机推荐

  • 如何拦截所有 Nancy 请求

    我看过这个帖子 南希 如何捕获所有请求 无论动词或路径如何 https stackoverflow com questions 17591494 nancy how do i capture all requests irrespectiv
  • Backbone.js - 从集合创建中获取 id

    我正在使用以下方法将模型添加到集合中create方法和 api 响应良好 模型似乎已正确返回并查看console dir resp 这就是我一直在寻找的东西 但是 当我尝试访问时runningorderid 哪一个是id定义为idAttri
  • jQuery 函数语法差异

    如何 function code jQuery 与 不同 document ready function 在jquery中 我知道什么是ready函数确实如此 它会等待 HTML 加载完毕后再开始 然而 确实 function 照着做 我知
  • 从远程 Git 存储库中删除所有文件和历史记录,而不删除存储库本身

    如果有人能告诉我如何删除 git 存储库上的每个文件 文件夹而不实际删除存储库本身 我将不胜感激 我也想删除与这些文件相关的所有历史记录 正如我所解释的这个答案 https stackoverflow com questions 18112
  • 将图像文件保存到临时目录

    我有一个名为 Image png 的图像文件 它保存在我的主包中 位于项目导航器层次结构中的 ViewController swift 文件旁边 我想将此图像的副本保存到临时目录 我以前没有做过 请问我可以使用什么代码 像这样的事情应该可以
  • scrapy 不打印异常的堆栈跟踪

    是否有一种特殊的机制来强制 scrapy 打印出所有 python 异常 堆栈跟踪 我犯了一个简单的错误 错误地获取了列表属性 导致 AttributeError 没有在日志中完整显示 出现的是 2015 11 15 22 13 50 sc
  • LinqKit 谓词生成器抛出 TypeLoadException?

    我在尝试执行使用 PredicateBuilder 动态构建的查询时遇到问题 我能够构建查询 但是在执行查询本身时 我得到以下 TypeLoadException 运行时 return context SearchRecords AsExp
  • 在Python中使用libclang解析C++

    经过一些研究和几个问题后 我最终探索了libclang https pypi python org pypi clang 3 5库以便在 Python 中解析 C 源文件 给定一个 C 源代码 int fac int n return n
  • 没有模板参数的模板类的容器

    我想知道您是否可以拥有一个包含具有不同模板参数的对象的容器 我正在努力实现这样的目标 include
  • 单击时发生指针事件,但滚动时不发生指针事件

    是否可以允许单击但不允许滚动事件 pointer events none 将禁用两种类型的输入 我想仅禁用滚动 还有其他解决方法的想法吗 添加这个CSS stopScroll height 100 overflow hidden 然后在 j
  • 如何判断线段是否在多边形内部?

    我们有一个线段L由两点定义从多边形和一个多边形P由 4 个或更多点定义 我需要一个算法来确定是否L在里面P 编辑 线段必须完全位于多边形内部 如果仅部分位于多边形内部 则将其定义为外部 例如看下图 再举几个例子 Step 1 L 是否穿过
  • 关于 addBatch(String) 的注意事项

    旁边的addBatch 的方法PreparedStatement还有一个addBatch String 方法中的Statement class 我想处理一系列不同的 sql 语句 并且正在寻找有关 addBatch String 性能方面含
  • id 为“xxxx”的进程未在 Visual Studio 中运行(包括 2013 至 2017~ 版本)

    我无法从 Visual Studio 2013 运行任何应用程序 它会抛出 ID 为 xxxx 的进程未运行消息 我也用过 Telerik 我尝试了互联网上的所有解决方案 除了重新安装 Visual Studio 但没有任何帮助 请帮助 谢
  • 如何在 Java 中复制 PostgreSQL 的 uuid_generate_v3()?

    PostgreSQL create extension if not exists uuid ossp select uuid generate v3 uuid nil this is a test uuid generate v3 e1e
  • 电路如何再次闭合?

    我正在尝试理解 Hystrix 据我所知 当服务调用第三方服务并且该服务没有响应并且阈值已超过配置时 电路将被打开 并且后续呼叫将被短路 但我无法理解电路如何再次闭合 让我们假设我们的服务正在调用第三方服务 并且该服务无法正常工作 因此电路
  • 在 Mac OS X 中修改窗口按钮颜色

    如何修改 Mac OS X 中用于关闭 最小化 缩放的红色 黄色 绿色窗口按钮 某处必须有可编辑的资源或 plist 以下是我正在谈论的按钮 对于红 绿色色盲的人来说 这些颜色可能会让人抓狂 我希望他们选择交通灯中使用的真正的蓝色阴影 而不
  • 具有自定义 bin 边缘的 ggplot2 密度直方图

    我能够绘制密度直方图 并且能够使用自定义箱绘制常规直方图 但不能同时绘制两者 这是我的尝试 library ggplot2 vals c 2 6 5 2 4 1 6 9 5 7 5 2 4 4 5 5 6 3 6 1 4 7 1 4 myp
  • 包括静态库到./configure

    如何在执行命令时包含两个静态库 configure Ex configure prefix usr LDFLAGS L home lancy dictionary src WordNet 3 0 lib lWN 这里只包含一个静态库 我如何
  • 问题使用 msbuild 构建具有多个配置的单个项目

    Issue 我们在解决方案中使用配置转换 例如 调试 测试 登台 发布 但是 这些配置仅用于我们的 MVC 项目 所有的库只使用调试和发布 这更有意义 因为我们的库只需要在调试模式或发布模式下构建 尝试从命令行构建单个项目时会出现此问题 我
  • 在 Angular 13 中实现 Monaco 编辑器

    在 Angular 13 中实现 Monaco 编辑器的最佳选择是什么 我见过 ngx monaco editor 但上次更新是 9 个月 它已经升级到 Angular 12 Monaco 版本也有 0 20 0 11 02 2020 非常