Excel任务窗格 – bindingDataChanged事件永远不会结束

我正在处理Excel任务窗格应用程序。 基本上它是当用户input时用无效格式(邮政编码r1243)更改单元格的背景颜色。 我创build了一个绑定,并添加了一个BindingDataChanged事件处理程序,用于监听数据更改。 如果有任何更改,请确认格式,然后更改背景颜色。 代码如下。

代码是有用的工作,但问题是,即使没有任何数据的变化onBindingDataChanges似乎永远不会结束。 什么可能是错的?

function listenChanges() { Office.select("bindings#customerTableBinding").addHandlerAsync(Office.EventType.BindingDataChanged, onBindingDataChanged, function (asyncResult) { if (asyncResult.status === "failed") { app.showNotification('Error: ' + asyncResult.error.message); } else { app.showNotification('New event handler added for binding.'); } }); } function onBindingDataChanged(eventArgs) { eventArgs.binding.getDataAsync({coercionType: 'table'}, function (asyncResult) { if (asyncResult.status == 'succeeded') { var table = new Office.TableData(); table.headers = asyncResult.value.headers; table.rows = asyncResult.value.rows; var column = getColumns(table); var rows = getRows(table, column); eventArgs.binding.setFormatsAsync([{ cells: Office.Table.Data, format: { backgroundColor: "white" } }], function (asyncResult) { }); for (var i = 0; i < rows.length; i++) { eventArgs.binding.setFormatsAsync([{ cells: { row: rows[i], column: column }, format: { backgroundColor: "red", fontStyle: "bold" } }], function (asyncResult) { }); } } else app.showNotification("The error message is " + asyncResult.error.message); }); } function getColumns(table) { var column; for (var i = 0; i < table.headers.length; i++) { for (var j = 0; j < table.headers[i].length; j++) { if (table.headers[i][j] == "PostalCode") { column = j; } } } return column; } function getRows(table, column) { var rows = new Array(); for (var i = 0; i < table.rows.length; i++) { if (!isValidUSZip(table.rows[i][column])) { rows.push(i); } } return rows; } function isValidUSZip(zip) { return /^\d{5}(-\d{4})?$/.test(zip); } 

eventArgs.binding.setFormatsAsync([{cells:Office.Table.Data,format:{backgroundColor:“white”}}],function(asyncResult){});

每当更改事件触发时,您都将背景设置为白色。 这将触发更改事件再次触发(导致无限循环)。 为了解决这个问题,你可以在数据事件动作被触发时移除该处理程序,然后在更新之后将其添加回来。

 function addHandlerChanged() { if (selfBinding) { selfBinding.addHandlerAsync( Office.EventType.BindingDataChanged, dataChangeEvent); } } function removeHandlerChanged() { if (selfBinding) { selfBinding.removeHandlerAsync( Office.EventType.BindingDataChanged, { handler: dataChangeEvent }, function (result) { }); } }; function dataChangeEvent(eventArgs) { //remove handler removeHandlerChanged(); // do you're table format update here //then add the handler back addHandlerChanged(); }