xxxxxxxxxx其实我们的布局器集成的各类UI就是第三方组件,您可能忽略了这一点下面我们以二维地图leaflet为例进行讲解大部分人集成后发现布局器无法初始化出来,于是觉得是布局器的问题,
xxxxxxxxxxPS:其实布局器仅仅是把您的组件引入,再执行js代为渲染,组件不出来大部分是您的js写法不对造成,这种情况很好解决,您自己在本地写一个示例,新建一个html,引入资源,放入html,初始化脚本看看是否能出来,如果这个没问题,再考虑往布局器集成。如果还不行,请联系管理员QQ:799374340(务必完成ps的内容后再联系管理员)
xxxxxxxxxxhttps://gitee.com/magicalcoder/vue-magicalcoder-demo
xxxxxxxxxx首先选择您采用的ui,比如是element 那么我们打开iframe-alement-2.10.1.html请参考以下引入放置的位置 在iframe-ui-before.js之前引入<!--ajax库--><script type="text/javascript" src="assets/drag/js/lib/vue/axios.js"></script><!-- 二维地图 不需要可以删除 非必须--><link href="assets/drag/js/lib/leaflet/leaflet.css" rel="stylesheet"><script type="text/javascript" src="assets/drag/js/lib/leaflet/leaflet.js"></script><!-- iframe-页面初始化js --><script type="text/javascript" src="assets/drag/js/user/ui/iframe-ui-before.js"></script>
xxxxxxxxxx找到assets/js/user/ui/element/2.10.1/constant.js在this.components变量里随便找一处,放入一下配置,这样左侧就出现了二维地图{name:"二维地图",icon:"ri-bar-chart-grouped-line",html:"<div class='mc-leaflet-map' style='height:400px;'></div>"}此时我们可以打开布局器预览下:实际会发现 左侧可拓展区域增加了二维地图,但是拖拽到工作区发现并没有出现地图这是怎么回事呢?原因是:我们还需要对集成的二维地图进行js初始化
xxxxxxxxxx布局器每次渲染工作区时,会执行element\2.10.1\iframe-ui.js的render方法;而我们就可以在render方法里加入我们的地图初始化逻辑 关于这个初始化脚本写在哪有很多种方法:方法1:放入constant.js的this.defaultJavascript内,方法2:直接写iframe-ui.js内的rebder方法内方法3:自己建一个新js文件,在iframe-element-2.10.1.html中引入,然后在render方法后面加入一段调用逻辑即可(调用逻辑也可以放constant.js的this.defaultJavascript)本示例我们采用比较优雅的写法:放入ui/magicalcoder/1.1.0/magicalcoder.js内 这里是我们为echarts组件初始化编写的大量初始化脚本this.defaultJavascript下的new McECharts().render()就是初始化入口 所以我们不用再render里注入入口了请参考代码:McECharts.prototype.render = function(){...this.leaflet();}/*二维地图*/McECharts.prototype.leaflet = function(){var _t = this;var doms = document.getElementsByClassName("mc-leaflet-map");for(var i=0;i<doms.length;i++){var dom = doms[i];var id = dom.getAttribute("id");if(!id){continue;}//第一步 让用户把基础的配置都通过布局器做好了var userConfigOption = this.iteratorDomAttrToOption(dom);//到 mapbox 官网注册并创建下面的access token都是免费的,不过有5w次的浏览限制var url = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';//初始化 地图var leafletMap = L.map(id).setView([41, 123], 5);//将图层加载到地图上,并设置最大的聚焦还有map样式L.tileLayer(url, {maxZoom: 18,id: 'mapbox.streets'}).addTo(leafletMap);//增加一个marker ,地图上的标记,并绑定了一个popup,默认打开L.marker([41, 123]).addTo(leafletMap).bindPopup("<b>Hello world!</b><br />I am a popup.").openPopup();//增加一个圈,设置圆心、半径、样式L.circle([41, 123], 500, {color: 'red',fillColor: '#f03',fillOpacity: 0.5}).addTo(leafletMap).bindPopup("I am a circle.");//增加多边形L.polygon([[41, 123],[39, 121],[41, 126]]).addTo(leafletMap).bindPopup("I am a polygon.");//为点击地图的事件 增加popupvar popup = L.popup();function onMapClick(e) {popup.setLatLng(e.latlng).setContent("You clicked the map at " + e.latlng.toString()).openOn(leafletMap);}leafletMap.on('click', onMapClick);}
}
xxxxxxxxxx找到constant.js的this.tagClassMapping 追加下面的一条配置:"mc-leaflet-map":{name:"二维地图",dragInto:false,duplicate:true,duplicateAttr:["id"],assistDuplicate:true, copy:true, paste:false, canDelete:true,assistDelete:true,afterDragDrop:{refresh:true},afterResize:{refresh:true},tmpWrapTag:"div",tmpWrapShade:true},
xxxxxxxxxx注意这里用了duplicateAttr:["id"] 就可以保证自动生成一个唯一idtmpWrapTag:tmpWrapShade 是因为地图本身有拖拽 布局器也有拖拽 这就冲突了 所以我们遮盖地图本身的拖拽
xxxxxxxxxx找到constant.js的 追加leaflet.css leaflet.js到以下配置 这样单独预览页就能看到了:view:{//预览地址url:envConstantSettings.view.url,//layui弹窗配置 area[0]宽如果不写则自动根据当前选中的设备模式宽 area[1]高layerExtra:envConstantSettings.view.layerExtra,//预览页<head></head>内的样式地址link:["assets/drag/ui/element/2.10.1/element.css","assets/drag/ui/magicalcoder/1.1.0/magicalcoder.css","assets/drag/js/lib/leaflet/leaflet.css"],//预览页<head></head>内的脚本地址headJs:[],//预览页<body></body>内的脚本地址bodyJs:["assets/drag/js/lib/echarts/4.6.0/echarts.min.js","assets/drag/js/lib/echarts/datatool.min.js","assets/drag/ui/magicalcoder/1.1.0/magicalcoder.js","assets/drag/js/lib/vue/vue.js","assets/drag/ui/element/2.10.1/element.js","assets/drag/js/lib/vue/axios.js","assets/drag/js/lib/leaflet/leaflet.js",]},
结语:把布局器理解成一个比较高级的浏览器(可以拖拽,配置,渲染),您只要把自己封装的组件引入布局器加载的正确位置,那就可以成功嵌入了。