我正在使用 ngx-monaco-editor 在模态中实现代码编辑器。因为我需要支持多个选项卡,所以我需要为模型准备一张地图,以记住带有 Uris 的模型。模态框也可以在关闭后重新打开。
问题:一旦我重新打开模式并选择以前打开的文件,它会抛出错误:
Cannot add model because it already exists
我不确定为什么 ngx-monaco-editor 在组件被销毁后不销毁模型。
有没有一种方法可以在关闭模式之前手动清除这些模型。
我正在使用 ngx-monaco-editor 在模态中实现代码编辑器。因为我需要支持多个选项卡,所以我需要为模型准备一张地图,以记住带有 Uris 的模型。模态框也可以在关闭后重新打开。
问题:一旦我重新打开模式并选择以前打开的文件,它会抛出错误:
Cannot add model because it already exists
我不确定为什么 ngx-monaco-editor 在组件被销毁后不销毁模型。
有没有一种方法可以在关闭模式之前手动清除这些模型。
下面的方法是我到目前为止找到的方法:
monaco.editor.getModels().forEach(model => model.dispose());
获取所有模型并在组件销毁方法中调用其 dispose 方法。
如果你有一个引用模型的散列,你可以dispose
通过散列调用模型实例:
hashOfModels[uri].dispose();
因为模型仅代表文本文件的状态,所以您还必须隐藏编辑器状态(请参阅editor.saveViewState
和editor.restoreViewState
),否则每次切换选项卡时编辑器基本上都会滚动到文件的开头(并将光标放在那里)。
您可以将模型和视图存储在一起。基本上,创建一个名为 的哈希editorState
,对于每个打开的文件,使用文件的路径作为键和一个{model, view}
哈希来存储编辑器的状态。
当您第一次将模型(对于新打开的文件)加载到编辑器(使用editor.setModel
)中时,编辑器将处于其初始状态,因此您可以editor.saveViewState
在之后立即调用以获取可以用作起点的视图实例。
每次切换选项卡时,先存储当前视图和模型,然后再加载要切换到的视图和模型。
每当您创建一个新模型时,请使用 try-catch,如果该模型已经存在,只需切换到相应的选项卡(因此打开一个打开的文件只是将其聚焦)而不是创建一个新模型(确保您已经初始化的任何内容)该openFile
函数将被GCed)。