Word JS API:Range.compareLocationWith 不工作

问题描述 投票:0回答:1

我正在尝试确定用户是否点击了另一段。 我的方法:之前选择的段落作为 Range 对象存储在本地,以便在发生另一次点击时与稍后进行比较。

这是获取所选段落的代码:

export const getSelectedParagraphRange = async () => {
  return await Word.run(async (context) => {
    const range = context.document
      .getSelection()
      .paragraphs.getFirst()
      .getRange()

    return range
  })
}

这是比较范围的代码:

export const isParagraphStillActive = async (range: Word.Range) => {
  return await Word.run(async (context) => {
    const newRange = context.document
      .getSelection()
      .paragraphs.getFirst()
      .getRange()

    const compare = range.compareLocationWith(newRange)
    await context.sync()

    return compare.value === 'Equal'
  })
}

如果我将 newRange 与其自身进行比较,它会起作用(我得到一个值为“Equal”的比较对象)。 但是,如果我将参数范围与自身进行比较,它就不起作用(函数只是“停止”而没有抛出错误等)。

所以我的猜测是应该比较的范围对象必须直接从函数内部获取?如果是这样,那么我想知道如何将以前选定的段落与新选定的段落进行比较? 非常感谢任何帮助。

更新:

感谢学习提到的 Building Office Add-ins 一书,我设法完成了段落比较工作。 getSelectedParagraphRange 函数缺少通过调用 range.track() 来跟踪范围对象。此外,在将新段落设置为当前段落时,必须取消跟踪范围。 (我根本不知道隔离上下文范围背后的原则)。

这是工作代码:

export const getSelectedParagraphRange = async (formerRange?: Word.Range) => {
  return await Word.run(async (context) => {
    if (formerRange) {
      formerRange.untrack()
      await context.sync()
    }

    const range = context.document
      .getSelection()
      .paragraphs.getFirst()
      .getRange()
    range.track()
    await context.sync()

    return range
  })
}

export const isParagraphStillActive = async (range: Word.Range) => {
  return await Word.run(range, async (context) => {
    const newRange = context.document
      .getSelection()
      .paragraphs.getFirst()
      .getRange()

    const compare = range.compareLocationWith(newRange)
    await context.sync()

    return compare.value === 'Equal'
  })
}
ms-word office-js office-addins word-addins word-web-addins
1个回答
0
投票

您需要将

range
对象传递给以对象作为第一个参数的
Word.run
的重载。

export const isParagraphStillActive = async (range: Word.Range) => {
  return await Word.run(range, async (context) => {
    const newRange = context.document
     .getSelection()
     .paragraphs.getFirst()
     .getRange()

    const compare = range.compareLocationWith(newRange)
    await context.sync()

    return compare.value === 'Equal'
  })
}

参见Word.run。对于像这样的高级场景,我还推荐这本书Building Office Add-ins

© www.soinside.com 2019 - 2024. All rights reserved.