如何清除现有模型,或者重新初始化Monaco编辑器?

9
我正在使用ngx-monaco-editor在模态框中实现代码编辑器。因为我需要支持多个标签页,所以需要准备一个 map 来记住具有 Uri 的模型。该模态框在关闭后也可以重新打开。
问题: 当我重新打开模态框并选择以前打开的文件时,会抛出错误:
Cannot add model because it already exists

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

有没有办法在关闭模态框之前手动清除这些模型。

2个回答

20

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

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

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


1
monaco-editor@0.29.1: getModelsundefined。但是有一个 getModel() 方法。 - Mir-Ismaili

2

如果您有一个引用了模型的哈希表,您可以通过哈希表调用dispose方法来处理模型实例:

hashOfModels[uri].dispose();

因为模型仅代表文本文件的状态,您还需要存储编辑器状态(请参见editor.saveViewStateeditor.restoreViewState),否则每次切换选项卡时,编辑器基本上会滚动到文件开头(并将光标放置在那里)。
您可以将模型和视图一起存储。基本上,创建一个名为editorState的哈希,对于每个打开的文件,使用文件路径作为键和{model,view}哈希来存储编辑器的状态。
当您首次将模型(用editor.setModel)加载到编辑器中(对于新打开的文件),编辑器将处于其初始状态,因此您可以立即调用editor.saveViewState以获取可以用作起点的视图实例。
每次切换选项卡时,在加载要切换到的选项卡之前存储当前视图和模型。
每当创建新模型时,请使用try-catch,如果模型已经存在,则只需切换到相应的选项卡(以便打开一个打开的文件只是将其聚焦),而不是创建一个新的模型(确保您已经在openFile函数中初始化了任何东西将被GC)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接