如何清除现有模型,或者有没有办法重新初始化摩纳哥编辑器

How to clear existing models, or is there a way to re-Init monaco editor

我正在使用 ngx-monaco-editor 在模态中实现代码编辑器。 因为需要支持多tab,所以需要为models准备一个map,用Uris记住models。 modal也可以关闭后重新打开

问题: 一旦我重新打开模式并选择以前打开的文件,它会抛出错误:

Cannot add model because it already exists

我不确定为什么 ngx-monaco-editor 在组件被销毁后不销毁模型。

有什么方法可以让我在关闭模态之前手动清除这些模型。

以下方法是我目前找到的方法:

monaco.editor.getModels().forEach(model => model.dispose());

获取所有模型并在组件销毁方法中调用其dispose方法

如果您有一个引用模型的散列,您可以通过散列在模型实例上调用 dispose

hashOfModels[uri].dispose();

因为模型只代表文本文件的状态,你还必须存储编辑器状态(参见editor.saveViewStateeditor.restoreViewState),否则编辑器基本上会滚动到开头每次切换标签时文件(并将光标放在那里)。

你可以把模型藏起来一起看。基本上,创建一个名为 editorState 的散列,对于每个打开的文件,使用文件的路径作为键和一个 {model, view} 散列来存储编辑器的状态。

当您第一次将模型(对于新打开的文件)加载到编辑器中时(使用 editor.setModel),编辑器将处于初始状态,因此您可以在之后立即调用 editor.saveViewState获取可用作起点的视图实例。

每次切换选项卡时,先存储当前视图和模型,然后再加载要切换到的选项卡。

每当你创建一个新模型时,使用 try-catch,如果模型已经存在,只需切换到相应的选项卡(这样打开一个打开的文件就会聚焦它)而不是创建一个新模型(确保您已经在 openFile 函数中初始化的任何内容都将被 GC。