这个问题可能是由于页面中有多个Monaco编辑器实例,每个实例都会触发自定义提示,导致重复出现。解决方法可以尝试以下两种:
-
在页面加载时,只初始化一个Monaco编辑器实例,其他编辑器实例可以在需要时动态创建和销毁。
-
在Monaco编辑器实例化时,可以设置一个唯一的标识符,然后在自定义提示回调中进行判断,只对当前编辑器实例进行处理,避免多个编辑器实例触发重复提示。例如:
const editor = monaco.editor.create(document.getElementById('editor'),
{ value: '', language: 'javascript' }); monaco.languages.registerCompletionItemProvider('javascript',
{ provideCompletionItems: (model, position) =>
{
if (model.uri.toString() === editor.getModel().uri.toString()) {
// 只对当前编辑器实例进行处理
return [
{ label: 'foo', kind: monaco.languages.CompletionItemKind.Function, insertText: 'foo()' } ]; }
}
});
需要注意的是,在新版的Monaco中,使用 getAssociatedResource()
方法获取资源的方式已经被废弃,需要使用 uri
属性来获取资源的标识符。