![summary-icon](https://cdn-vip.kingdee.com/statics/webfront/summary_icon.png)
本文介绍了在开发自定义控件时可能遇到的问题及解决方案,包括控件不生效、更新不生效、移动端报错、保存报错、关闭页面方法和IE浏览器语法异常等。提供了具体的检查步骤和修复建议,如确保id一致、正确编写index.js和html、清除浏览器缓存、更新静态文件服务、移除移动端jQuery依赖、检查静态资源目录路径和修正IE不支持的语法等。
创作不易,如果文章对您有帮助,请为我点击一个朴实无华的赞^_^,我会更有动力持续地更新文章。
官方知识区的文档:
https://vip.kingdee.com/article/210684616045450752
一,自定义控件不生效,预览时一片空白,自定义控件不显示的问题
1.确认id是否一致,index.js和控件方案中的id要一致,如果不一致,会导致自定义控件一片空白
2.index.js确认编写正确
3.确认html正确无误
如下图,如果有多个控件,可以使用div标签,如果是单个标签,直接使用对应html组件
不要使用<html><body><head>标签,如果用了,反而会导致自定义控件无法解析
二,自定义控件替换之后不生效的问题
自定义控件当然不可能一次性就编写完成,可能会存在多次调试,修改。
这就需要在控件方案中重复上传自定义控件的zip包,如果出现已经更新了zip包,但是并不生效。
这时候需要排查一下情况
1.排查浏览器缓存,导致新修改的js代码不生效
进入F12调试模式,进入sources页签,查看index.js的js源码
如果这个代码和已上传的zip中的js源码不一致,就是浏览器缓存js文件,导致新的js不生效
切换到network页签,勾选disable cache
刷新当前页面,新修改的js代码即可生效
2.排查静态文件服务中是否已更新对应的js
路径是:static-file-service\isv\开发商标识\领域标识\方案名称
以下是我的本地轻量级环境,对应的index.js获取其他.js文件是否已经更新
如果没有更新,还是之前的js代码,需要执行以下步骤
(1)进入控件方案中,删除对应的控件方案
(2)停止当前cosmic
(3)删除static-file-service\isv\开发商标识\领域标识\方案名称,对应的静态文件
(4)启动cosmic,重新进入云苍穹的开发页面,重新新增一个控件方案
如果static-file-service\isv\开发商标识\领域标识\方案名称,下面没有对应的目录结构。
那么可以把zip解压到对应目录下,开发商标识\领域标识\方案名称这个路径如果不存在就需要新建。
三,移动端报错
1.如果直接使用门户上的自定义控件案例代码,在移动端中运行,jquery会报错:jQuery is not defined
这是由于PC端的自定义控件默认提供jQuery,而移动端不提供jQuery
对象。
移动端如何移除jQuery
对象,请参考我的其他文章:
https://vip.kingdee.com/article/155310576162541312
四,控件方案保存报错 或者 404 not found 报错。
archive is not a ZIP archive
404状态码:
找到静态资源目录,查看下面是否有生成对应自定义控件方案。
如果没有,解决方案是手动解压
开发者自行把zip解压到 static-file-service\isv\开发商标识\领域标识\方案名称 的路径下面
苍穹linux版本,默认路径如下:
/苍穹安装目录/nginx-appstatic/appstore/appstatic/static-files/cosmic/webapp/isv/开发商标识/领域标识/控件方案名称
默认路径如上图,
如果静态目录在nginx上修改过,需要查看nginx配置文件的转发路径:
conf/conf.d/ierp.conf:
五,关闭当前页面,回到上一个页面的问题
父页面跳转到子页面之后,如果子页面使用完了,想要关闭子页面,回到父页面,一定要调用 getView().close()来关闭当前页面。
千万不能用showForm()去打开父页面。
之前遇到一个自定义控件一直无法获取焦点的问题,就是由于关闭页面的点击事件不是真的关闭,而是使用getView().showForm(showParameter)再去打开之前的页面。
这么做会导致原先打开的页面一直没有关闭。
六,语法异常
现象:在Chrome或者Firefox下运行没问题,在IE运行时报错
原因:jquery调用含参函数的时候写法错误导致
以下代码会导致ie浏览器报错:SCRIPT1002:语法错误
IE浏览器不支持Promise,不支持ES6语法
错误的方法:
functionName: (e) => {}
解决方案:
更换js的语法为以下方法
functionName : function (e) {}
推荐阅读