为什么要一次性批量创建界面?
WRS.createBillList/WRS.createBillCard/WRS.createBillTree等方法,其实是网络请求微服务,在Java服务器中计算出来的,并不是直接从Nginx中直接下载静态html/js文件的。
所以其实就是会慢一点,性能上比前后端分离的静态页面要慢,但因为我们想动态即时创建界面,所以这也是没有办法的事(至少目前没想到其他好办法)
理论上创建一个界面组件的性能会相差100~300毫秒左右,实际网络情况会在500毫秒左右。这个其实是完全可以接受甚至忽略不计的.
最关键的是,如果界面上创建多个组件,比如许多界面是一排多页签,每个页签里面又是上下左右创建多个表单与表格,多的有十几个数据组件(表格/表单/树)
这时会“量变导致质变”,即打开界面会比较慢,有时要3秒以上,这样就不太容易接受与忽略不计了
这里最本质的原因,就是网络请求次数太多,网络IO的握手是最耗资源的,所以必须降低网络请求次数。或者说,只要降低网络请求次数,性能就肯定与一次请求接近。
解决办法就是在原来createBillList/createBillCard方法前后各加以下两行代码:
WRS.beginCreate(); //预创建,在前端加上这行代码
WRS.createBillList(......); //创建表格
WRS.createBillCard(......); //创建卡片
WRS.commitCreate("wrsservice"); //实际提交创建,在后面加上这行代码
创建后返回结果不同
以前可以这样写:
var myTable = WRS.createBillList(......);
现在改成批量创建时,这行代码就不会返回值了,而是在WRS.commitCreate()时返回。
所以,写法要改成:
var myObjects = WRS.commitCreate("wrsservice"); //得交请求,获得整个结果
var myTable = myObjects[0]; //得到返回对象中的第一个
var myCard = myObjects[1]; //得到返回对象中的第二个
但d1_BillList、d1_A_BillCard、d1_A_1_BillTree,这种对象名还是可以直接使用的,即写法与原来不同!
所以也可以这样写:
WRS.commitCreate("wrsservice");
var myTable = d1_A_BillList; //定义新对象指向默认的对象名
var myCard = d1_A_BillCard;