我在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;
}
})();
答案 0 :(得分:0)
您所看到的是网络滞后。选择更改事件 - 一旦注册 - 源自服务器,并在触发事件处理程序的Office.js时触发代码。反过来,您的事件处理程序会创建一个本地请求来获取选择Range对象及其地址,并将其作为ctx.sync()
的一部分发送到服务器,然后等待从服务器收听,然后再触发{{ 1}}。
您无法做任何事情来优化此流程 - 您将在Excel Online上支付相当高的每笔交易成本,并且事件处理程序仅为该成本添加一个额外步骤。另一方面,好消息是基于.then
的模型允许您将多个请求批处理为一个,从而大大减少了原本需要的往返次数。也就是说,获取10个不同范围的值几乎与获取一个的速度相同;如果每个电话都单独发出,那么它的成本会高出10倍。
希望这有帮助!
~Michael Zlatkovsky,Office Extensibility团队的开发人员,MSFT