【 自定义控件】同一个自定义控件在打开的多个单据页面同时引入出现的问题及解决方案原创
金蝶云社区-cosmicstudio
cosmicstudio
7人赞赏了该文章 577次浏览 未经作者许可,禁止转载编辑于2021年09月22日 20:06:55

  • 出现的情况

  1. 因为是同一自定义控件,所有html标签ID如果写死就会出现ID值不唯一

  2. 通过model.invoke('method',args)方法与后台通信时,后台插件获取的视图模型this.getView()不是当前激活页面的视图模型



  • ID冲突

  1. html标签ID加上pageId解决ID冲突

var pageId = model.pageId.substring(18,model.pageId.length);

// gantt.html里面的代码
// <div id=<%= mainId %> ></div>;

KDApi.getTemplateStringByFilePath('./html/gantt.html',model.schemaId,{
  name_space: KDApi.nameSpace(model.schemaId),
  mainId:"work_"+pageId
}).then(result => {
  model.dom.innerHTML = result
  initEvent(model,data);
})


  • 插件获取的视图模型不是当前页面的视图模型

  1. 将当前页面自定义控件的数据存在model里面或者同model一起作为对象属性值放在同一个对象里面

  2. 定义map存储pageId与当前页面插件model的关联关系

  3. 与后台插件进行交互时先通过pageId获取model在去调用执行方法;getInstance(pageId).model.invoke('method',args)


// 设置实例 在index.js的init()执行
var setInstance = function(model){
  console.log("setInstance begin")
  var editorId = 'work_'+model.pageId.substring(18,model.pageId.length);
  if( typeof pageEditorInstance =='undefined'){
    pageEditorInstance = new Map();
  }
  var editorObj = new Object();
  editorObj.model = model;
  pageEditorInstance.set(editorId,editorObj);
  console.log("setEditorInstance end")
}

// 获取实例
var getInstance = function(pageId){
  var editorId = 'work_'+pageId;
  var editorInstance = pageEditorInstance.get(editorId);
  return editorInstance;
}

// 删除实例 在index.js的destoryed()执行
var deleteInstance = function(pageId){
  var editorId = 'work_'+pageId;
  pageEditorInstance.delete(editorId);
}



赞 7