有没有办法在Monaco Editor中手动触发验证?

时间:2019-05-09 01:00:15

标签: javascript typescript monaco-editor

我正在使用默认的TypeScript服务,并且根据一个模型对另一个模型进行异步初始化。在某些情况下,两个模型无法相互检测,因此显示出语义错误。如果我在从属模型中进行了一些编辑,导致重新验证了模型,则错误消失了。

我尝试手动设置setModel,从而解决了问题。但是,它破坏了撤消历史。

是否可以手动重新验证模型?

2 个答案:

答案 0 :(得分:0)

这就是我要解决的问题:

setInterval(() => {
    const range = new monaco.Range(1,1,1,1);
    const addEmptySpace = {forceMoveMarkers: true, range, text: ' '};
    for (const m of monaco.editor.getModels()) {
        const toInvert = m.applyEdits([addEmptySpace]);
        m.applyEdits(toInvert);
    }
}, 50*1000)

每插入五十秒钟,立即删除一个空格。我不喜欢,但是可以。

答案 1 :(得分:0)

这是我的解决方案,摘自monaco-typescript

async function revalidateModel(model) {
  if (!model || model.isDisposed()) return;

  const getWorker = await monaco.languages.typescript.getTypeScriptWorker();
  const worker = await getWorker(model.uri);
  const diagnostics = (await Promise.all([
    worker.getSyntacticDiagnostics(model.uri.toString()),
    worker.getSemanticDiagnostics(model.uri.toString())
  ])).reduce((a, it) => a.concat(it));

  const markers = diagnostics.map(d => {
    const start = model.getPositionAt(d.start);
    const end = model.getPositionAt(d.start + d.length);
    return {
      severity: monaco.MarkerSeverity.Error,
      startLineNumber: start.lineNumber,
      startColumn: start.column,
      endLineNumber: end.lineNumber,
      endColumn: end.column,
      message: flattenDiagnosticMessageText(d.messageText, "\n")
    };
  });
  const owner = model.getLanguageIdentifier().language;
  monaco.editor.setModelMarkers(model, owner, markers);
}

异步创建模型时,请调用上面的函数。