Office.js Word启用修订时绑定数据变更事件触发异常问题
问题背景
我正在使用Office.js开发Word加载项,需要实现内容控件内任意内容发生变更时的自动检测能力,为此采用绑定机制实现该需求,相关实现代码如下:
private createBindingOnContentControl = (title: string) => { // 该方法用于创建绑定并订阅数据变更事件 Office.context.document.bindings.addFromNamedItemAsync(title, Office.BindingType.Text, { id: title }, (result) => { if (result.status == Office.AsyncResultStatus.Succeeded) { console.log("Binding successfull for cc: ", title); // 绑定创建完成后订阅事件 result.value.addHandlerAsync(Office.EventType.BindingDataChanged, this.onBindingChangeHandler); result.value.removeHandlerAsync; } else console.log(result.error.message); }); }
问题现象
- 未开启审阅选项卡的**修订(Track changes)**功能时,上述逻辑运行完全正常
- 启用修订功能后:
- 在内容控件内新增内容、内容被标记为红色修订样式时,
OnBindingChangeHandler可以正常触发 - 删除被标记为红色带删除线的修订内容时,
OnBindingChangeHandler不会被调用
- 在内容控件内新增内容、内容被标记为红色修订样式时,
- 核心疑问:该现象是启用修订状态下删除内容时绑定机制本身不支持,还是实现存在遗漏或错误?
问题解答
该现象是Office.js Word API现有绑定机制的设计限制,并非代码逻辑错误。
原因说明
BindingDataChanged事件的触发判定,仅针对内容控件绑定范围内已落盘的正式文本内容变更。开启修订模式后,带删除线的待接受修订内容属于临时修订标记,并未从绑定对应的正式文本存储中移除;此时对这类待修订删除内容执行操作,不会改变绑定识别到的正式文本值,因此不会触发变更事件。
另外代码中存在一处不影响当前逻辑的冗余问题:result.value.removeHandlerAsync;仅引用了方法对象,既没有加括号执行,也没有传入需要移除的事件类型、处理函数参数,本身不会产生任何效果,建议删除,避免后续维护时出现内存泄漏或事件重复绑定的隐患。
可行替代方案
- 方案1:补充监听文档级
Office.EventType.DocumentSelectionChanged事件,每次触发时主动读取目标内容控件的全量内容(包含修订标记状态的内容),和本地缓存的上一次内容做比对,即可覆盖修订模式下的删除场景,该方案对用户操作无侵入。 - 方案2:如果业务场景允许,可以在用户进入指定内容控件编辑时,临时提示关闭修订模式,退出内容控件编辑范围后再恢复原有修订状态,该方案实现简单但会对用户体验造成一定影响。
内容的提问来源于stack exchange,提问作者Muhammad Umar
相关产品推荐
相关产品推荐

