Ace Editor中代码片段取消注册失效,如何正确实现取消注册?
ACE编辑器代码片段取消注册无效的解决办法
我能成功注册ACE编辑器的代码片段,代码如下:
var editor = ace.edit("editor"); var snippetManager = ace.require("ace/snippets").snippetManager; var snippetText = "snippet vfx\n\t<visalforce>\n\t\t$1\n\t</visalforce>"; var snippets = snippetManager.parseSnippetFile(snippetText); snippetManager.register(snippets); editor.setOptions({ enableBasicAutocompletion: true, enableSnippets: false });
但执行取消注册操作时始终无效,尝试过以下写法及多种变体:
snippetText = "snippet vfx\n\t<visalforce>\n\t\t$1\n\t</visalforce>"; snippets = snippetManager.parseSnippetFile(snippetText); snippetManager.unregister(snippets);
问题依旧,代码片段仍在编辑器中可用。
问题原因
每次调用parseSnippetFile都会生成全新的代码片段对象,即使内容完全一致,这个新对象和之前注册的对象引用也不相同。snippetManager.unregister是通过对象引用来匹配删除的,所以用新生成的对象去取消注册自然无效。
解决方案
方案1:保留注册时的原始引用
注册代码片段时,把返回的snippets对象保存下来,取消注册时直接使用这个原始引用:
// 在合适的作用域保存注册后的snippets引用 var registeredSnippets; // 注册逻辑 var editor = ace.edit("editor"); var snippetManager = ace.require("ace/snippets").snippetManager; var snippetText = "snippet vfx\n\t<visalforce>\n\t\t$1\n\t</visalforce>"; registeredSnippets = snippetManager.parseSnippetFile(snippetText); snippetManager.register(registeredSnippets); editor.setOptions({ enableBasicAutocompletion: true, enableSnippets: false }); // 取消注册时直接用原始引用 snippetManager.unregister(registeredSnippets);
方案2:遍历查找并删除目标片段
如果没法保留原始引用,可以遍历snippetManager.snippets集合,通过片段名称匹配找到目标项,再调用unregister删除:
var snippetManager = ace.require("ace/snippets").snippetManager; var targetSnippetName = "vfx"; // 遍历所有已注册片段,匹配名称后删除 snippetManager.snippets.forEach(function(snippet) { if (snippet.name === targetSnippetName) { snippetManager.unregister([snippet]); // unregister接受片段数组作为参数 } });
内容的提问来源于stack exchange,提问作者Arwen
相关产品推荐
相关产品推荐

