如何清除现有模型,或者有没有办法重新初始化摩纳哥编辑器
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.saveViewState
和editor.restoreViewState
),否则编辑器基本上会滚动到开头每次切换标签时文件(并将光标放在那里)。
你可以把模型藏起来一起看。基本上,创建一个名为 editorState
的散列,对于每个打开的文件,使用文件的路径作为键和一个 {model, view}
散列来存储编辑器的状态。
当您第一次将模型(对于新打开的文件)加载到编辑器中时(使用 editor.setModel
),编辑器将处于初始状态,因此您可以在之后立即调用 editor.saveViewState
获取可用作起点的视图实例。
每次切换选项卡时,先存储当前视图和模型,然后再加载要切换到的选项卡。
每当你创建一个新模型时,使用 try-catch,如果模型已经存在,只需切换到相应的选项卡(这样打开一个打开的文件就会聚焦它)而不是创建一个新模型(确保您已经在 openFile
函数中初始化的任何内容都将被 GC。
我正在使用 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.saveViewState
和editor.restoreViewState
),否则编辑器基本上会滚动到开头每次切换标签时文件(并将光标放在那里)。
你可以把模型藏起来一起看。基本上,创建一个名为 editorState
的散列,对于每个打开的文件,使用文件的路径作为键和一个 {model, view}
散列来存储编辑器的状态。
当您第一次将模型(对于新打开的文件)加载到编辑器中时(使用 editor.setModel
),编辑器将处于初始状态,因此您可以在之后立即调用 editor.saveViewState
获取可用作起点的视图实例。
每次切换选项卡时,先存储当前视图和模型,然后再加载要切换到的选项卡。
每当你创建一个新模型时,使用 try-catch,如果模型已经存在,只需切换到相应的选项卡(这样打开一个打开的文件就会聚焦它)而不是创建一个新模型(确保您已经在 openFile
函数中初始化的任何内容都将被 GC。