Addin行为多个打开的Word文档

时间:2018-02-04 11:51:18

标签: javascript ms-word office-js office-addins

发现问题! 我擦除了stackoverflow并找到了:this。这似乎是个问题。 Browsersync具有导致这些问题发生的有趣行为。所以我的新问题是:如何在没有浏览器同步的情况下部署单词加载项?我已经尝试分别直接在app.ts和app.js上运行tsc和node,但这只是给了我一个错误:     ReferenceError:未定义Office

我是开发办公室加载项的新手。我有一个加载项,当我打开一个文档时,该加载项有效。如果我打开了多个文档,我期望的行为是,加载项的功能在启动时应该只应用于焦点文档。

这实际上并没有发生。我已经完成了多项测试,并且无法弄清楚发生了什么。有时,按下第二个打开文档的加载项窗口中的按钮将对第一个打开的文档执行操作。有时,在第二个。

编辑:这是一个最小的工作示例:

(function () {

    // The initialize function is run each time the page is loaded.
    Office.initialize = function (reason) {
        $(document).ready(function () {

            // Use this to check whether the API is supported in the Word client.
            if (Office.context.requirements.isSetSupported('WordApi', 1.1)) {
                // Do something that is only available via the new APIs
                $('#clear').click(clearHighlighting);
                $('#supportedVersion').html('This code is using Word 2016 or greater.');
            } else {
                // Just letting you know that this code will not work with your version of Word.
                $('#supportedVersion').html('This code requires Word 2016 or greater.');
            }
        });
    };

    var highlighted = [];

    function clearHighlighting() {
        Word.run(function (context) {
            console.log("clearing highlighting");
            document.getElementById("status").innerHTML = "";
            var body = context.document.body;
            body.font.highlightColor = null;
            return context.sync();

        }).catch(function (error) {
            console.log('Error: ' + JSON.stringify(error));
            if (error instanceof OfficeExtension.Error) {
                console.log('Debug info: ' + JSON.stringify(error.debugInfo));
            }
        });
    };
});
  1. 我的问题是, 在这种情况下的预期行为是什么?
  2. 如何限制对文档的操作?
  3. 每个打开的文档都是重复加载项的元素吗?如果不是,则更改插件div中的文本可能与焦点文档相关,也可能不相关。
  4. 编辑2

    我观察到的行为是,打开加载项的任务窗格打开的任何文档都将调用该函数,而不管我实际单击该按钮的任务窗格。

    控制台显示该函数被调用一次(来自console.log语句),但文档全部被修改。

    我正在将Office.document.url打印到控制台。如果我将调试器附加到Doc A,并按下Doc A中的加载项按钮,我将看到控制台仅记录Doc B的URL,但Doc A和Doc B的状态div都将显示各自的网址。

      console.log("clearing highlighting"+Office.context.document.url);
      document.getElementById("status").innerHTML = Office.context.document.url;
    

    在上面的代码片段中,第一行仅在控制台中显示第二个文档(即使在第一个文档中单击了按钮),第二行在两个文档中执行操作。应该注意,调试器附加到第二个文档。

    编辑: 我将所有代码重构为一个新的TypeScript加载项。我观察到同样的行为。所有打开的文档都会受到影响:

    (() => {
    // The initialize function must be run each time a new page is loaded 
     Office.initialize = (reason) => {
      $(document).ready(() => {
     (window as any).Promise = OfficeExtension.Promise;
      $('#clear').click(clearHighlighting);
     });
    };
    
    async function clearHighlighting() {
    
    await Word.run(async (context) => {
      console.log("clearing highlighting"+Office.context.document.url);
      document.getElementById("status").innerHTML = Office.context.document.url;
      var body = context.document.body;
      body.font.highlightColor = null;
    
      await context.sync();
    });
    
    }
    })();
    

1 个答案:

答案 0 :(得分:1)

我是正式的白痴。

这让我花了太长时间来调试。以下是调查结果。

  1. 这确实是browserync的一个问题。只有在测试时才会出现此行为,这就是为什么那些试图重现此行为的人无法做到的。

  2. 部署此代码非常简单,只需将其放入Web服务器即可。因为它是所有客户端代码,所以任何Web服务器都可以(不需要对node.js大惊小怪)。

  3. 感谢大家的帮助。

    如果有其他人遇到此问题,this post会直观地解释。