標籤:
上回我們說了怎麼搭建一個簡單的載入flash的方法,在flexviewer的gis開發中有很多載入順序要注意,比如swf順序,xml的順序,要在地圖做某些互動操作必須得等這些東西載入完畢才能調用,還有你在flex寫widget的註冊了javascript調用的方法,所以我們在flex端拋出一個事件,通過as的ExternalInterface.call 告訴javascript端圖形載入完畢,這麼我們就要定義事件通訊,老實說我不太喜歡js那個事件,自己寫個數組去記錄這個訊息。
1 /** 2 * Created with JetBrains WebStorm. 3 * User: haibalai 4 * Date: 15-12-9 5 * Time: 下午3:40 6 * To change this template use File | Settings | File Templates. 7 */ 8 9 var EventBus =function (){10 this.handlers={};11 this.objs = {};12 }13 14 EventBus.prototype={15 constructor:EventBus,16 17 /**18 * 添加事件19 * @param type20 * @param handler21 */22 addEventListener:function(type,handler){23 if(typeof this.handlers[type]==‘undefined‘){24 this.handlers[type]=new Array();25 }26 this.handlers[type].push(handler);27 },28 29 /**30 * 刪除事件31 * @param type32 * @param handler33 */34 removeEventListener:function(type,handler){35 if(this.handlers[type] instanceof Array){36 var handlers=this.handlers[type];37 for(var i=0,len=handlers.length;i<len;i++){38 if(handler[i]==handler){39 handlers.splice(i,1);40 break;41 }42 }43 }44 },45 46 /**47 * 拋事件48 * @param event49 */50 dispatchEvent:function(event){51 52 53 if(!event.target){54 event.target=this;55 }56 if(this.handlers[event.type] instanceof Array){57 var handlers=this.handlers[event.type];58 this.objs[event.type] = [event.obj];59 for(var i=0,len=handlers.length;i<len;i++){60 handlers[i](event);61 }62 }63 }64 }
我們把這個事件類別初始化到MapControl裡面,我在Parameter類加入了swfid的屬性,防止一個頁面載入兩個地圖造成混亂。
1 var MapControl = function () { 2 /** 3 * 地圖初始化parameter 具體參考Parameter類 4 * @type {Parameter} 5 */ 6 this.parameter = new Parameter(); 7 /** 8 * 添加事件主體 具體參考EventBus類 9 * @type {EventBus}10 */11 this.eventBus = new EventBus();12 13 this.initialise =function () {14 15 16 swfobjhash[this.parameter.div] = this;17 var swfVersionStr = "11.4.0";18 var xiSwfUrlStr = "";19 var flashvars = {};20 21 var params = {};22 params.wmode = "opaque";23 params.quality = "high";24 params.bgcolor = "#ffffff";25 params.allowscriptaccess = "always";26 params.allowfullscreen = "true";27 var attributes = {};28 attributes.id = this.parameter.div;29 attributes.name = this.parameter.div;30 attributes.align = "middle";31 swfobject.embedSWF(32 "http://localhost/mymap/index.swf" + this.parameter.getUrlString() , this.parameter.div,33 this.parameter.width, this.parameter.height,34 swfVersionStr, xiSwfUrlStr,35 flashvars, params, attributes);36 swfobject.createCSS("#" + this.parameter.div, "display:block;text-align:left;");37 }38 39 }40 41 var swfobjhash = new Object();42 43 44 //flex圖形組件載入完畢回調 swfid是區分嵌入swf的標識碼45 function emapComplete(swfid) {46 swfobjhash[swfid].map.emap = document.getElementById(swfid);47 48 swfobjhash[swfid].eventBus.dispatchEvent({type: "Initialized"});49 }
我們再定義自己事件名稱
1 /** 2 * Created with JetBrains WebStorm. 3 * User: haibalai 4 * Date: 15-12-9 5 * Time: 下午3:40 6 * To change this template use File | Settings | File Templates. 7 */ 8 var MapControlEvent = { 9 /**10 * 地圖初始化事件11 */12 Initialized : "Initialized",13 14 }
在html頁面就可以這樣
<script type="text/javascript"> var a = new MapControl(); a.parameter.config = "config-checkview.xml"; a.parameter.div= "flashContent"; a.parameter.width = "800"; a.parameter.height = "800"; a.eventBus.addEventListener(MapControlEvent.Initialized,initHandle); a.initialise(); function initHandle() { alert("載入完畢") }</script>
業務gis 怎麼讓別的開發人員不需要懂gis就可以搞開發? (三)