有没有办法在摩纳哥编辑器中手动触发验证?

Is there a way to trigger validation manually in monaco editor?

我正在使用默认的 TypeScript 服务,并且模型是异步初始化的,一个模型依赖于另一个模型。有一种情况是两个模型无法检测到对方,因此显示语义错误。如果我在依赖模型中进行一些编辑,导致模型重新验证,错误就会消失。

我试过手动setModel,解决了问题。但是,它会破坏撤消历史。

有没有办法手动重新验证模型?

这是我修复它的方法:

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)

每五十秒插入并立即删除 space。我不喜欢它,但它有效。

这是我的解决方案,摘自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);
}

异步创建模型时调用上述函数。