ICN条目模板缓存致唯一案例编号重复问题求助
解决方案:ICN模板插件重复生成案例编号问题
我之前处理过好几起类似的ICN自定义插件缓存问题,咱们直接切入核心来解决:
问题根源
这个现象几乎可以肯定是插件的初始化逻辑只执行了一次,而ICN的客户端会缓存插件的状态和变量值。当你第一次打开模板时,插件生成了案例编号并填充;但第二次打开时,插件没有重新触发编号生成逻辑,直接复用了之前缓存的变量值,导致编号重复。
具体修复步骤
- 绑定正确的事件触发点:别把案例编号生成逻辑写在插件的
initialize方法里(这个方法只在插件加载时跑一次),而是绑定到模板每次打开的事件上,比如ICN的onTemplateOpened或者onDocumentNew事件。每次打开模板时,这个事件都会触发,确保重新执行填充逻辑。 - 重置内部变量:如果插件里有存储上次生成编号的变量(比如
cachedCaseNumber),每次触发模板打开事件时,先把这个变量清空或者重新调用生成方法,避免复用旧值。 - 实时获取上下文数据:用户邮箱可以通过ICN的
getCurrentUser()API实时获取(虽然邮箱一般不会变,但养成实时获取的习惯能避免其他缓存问题);案例编号如果是前端生成,建议用「时间戳+随机数+用户ID」的组合保证唯一性,如果需要全局唯一,最好调用后端接口生成(前端生成有重复风险)。 - 可选:禁用模板客户端缓存:如果上述方法都不生效,可以尝试在模板配置里禁用客户端缓存(注意会影响性能,作为最后手段),或者在插件加载模板时添加
no-cache请求头。
代码示例参考
// 插件中正确的事件绑定写法 this.subscribeEvent("onTemplateOpened", function(eventData) { // 实时获取登录用户邮箱 const currentUser = icnAPI.getCurrentUser(); const userEmail = currentUser.getEmail(); // 重新生成唯一案例编号(这里替换成你的生成逻辑) const uniqueCaseNumber = `${currentUser.getId()}-${Date.now()}-${Math.floor(Math.random() * 1000)}`; // 填充到对应的表单字段 const emailField = document.querySelector("[name='emailField']"); const caseNumberField = document.querySelector("[name='caseNumberField']"); if (emailField) emailField.value = userEmail; if (caseNumberField) caseNumberField.value = uniqueCaseNumber; });
关键提醒
一定要避免把需要动态生成的内容放在插件的初始化阶段,因为ICN的插件生命周期是加载一次后就常驻内存,除非刷新页面或清除缓存,否则初始化逻辑不会重复执行。绑定到模板打开的事件上,才能保证每次打开模板都触发新的生成逻辑。
内容的提问来源于stack exchange,提问作者bajji
相关产品推荐
相关产品推荐

