6

我正在使用 ngx-monaco-editor 在模态中实现代码编辑器。因为我需要支持多个选项卡,所以我需要为模型准备一张地图,以记住带有 Uris 的模型。模态框也可以在关闭后重新打开。

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

Cannot add model because it already exists

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

有没有一种方法可以在关闭模式之前手动清除这些模型。

4

2 回答 2

10

下面的方法是我到目前为止找到的方法:

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

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

于 2020-06-19T08:48:05.257 回答
2

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

hashOfModels[uri].dispose();

因为模型仅代表文本文件的状态,所以您还必须隐藏编辑器状态(请参阅editor.saveViewStateeditor.restoreViewState),否则每次切换选项卡时编辑器基本上都会滚动到文件的开头(并将光标放在那里)。

您可以将模型和视图存储在一起。基本上,创建一个名为 的哈希editorState,对于每个打开的文件,使用文件的路径作为键和一个{model, view}哈希来存储编辑器的状态。

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

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

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

于 2021-02-02T23:11:08.243 回答