使事件处理程序无缝?

时间:2016-05-20 14:12:07

标签: ms-office office-js

我在Excel online add-in下编写了一个事件处理程序。它由按钮activate激活,然后当用户点击另一个单元格或范围时,该地址将写在文本区域myTextArea上。整件事情都有效。

但是,一旦选择了新的单元格,焦点附近会显示绿色加载符号; WORKING...显示在Excel的底部;它几乎需要0.5 second

我很惊讶这样一个简单的动作需要时间。有谁知道是否有可能让这个事件更快地处理?否则,除了事件处理之外还有其他方法可以实现这一点吗?

(function() {
    "use strict";

    Office.initialize = function(reason) {
        $(document).ready(function() {
            app.initialize();            
            $('#activate').click(addSelectionChangedEventHandler);
        });
    }
    ;

    function addSelectionChangedEventHandler() {
        Office.context.document.addHandlerAsync(Office.EventType.DocumentSelectionChanged, MyHandler);
    }

    function MyHandler(eventArgs) {
        doStuffWithNewSelection();
    }

    function doStuffWithNewSelection() {
        Excel.run(function(ctx) {
            var selectedRange = ctx.workbook.getSelectedRange();
            selectedRange.load(["address"]);
            return ctx.sync().then(function() {
                write(selectedRange.address)
            })
        }).then(function() {
            console.log("done");
        }).catch(function(error) {
           ...
        });
    }    

    function write(message) {
       document.getElementById("myTextarea").value = message;
    }
})();

1 个答案:

答案 0 :(得分:0)

您所看到的是网络滞后。选择更改事件 - 一旦注册 - 源自服务器,并在触发事件处理程序的Office.js时触发代码。反过来,您的事件处理程序会创建一个本地请求来获取选择Range对象及其地址,并将其作为ctx.sync()的一部分发送到服务器,然后等待从服务器收听,然后再触发{{ 1}}。

您无法做任何事情来优化此流程 - 您将在Excel Online上支付相当高的每笔交易成本,并且事件处理程序仅为该成本添加一个额外步骤。另一方面,好消息是基于.then的模型允许您将多个请求批处理为一个,从而大大减少了原本需要的往返次数。也就是说,获取10个不同范围的值几乎与获取一个的速度相同;如果每个电话都单独发出,那么它的成本会高出10倍。

希望这有帮助!

~Michael Zlatkovsky,Office Extensibility团队的开发人员,MSFT