作者:Flyingis
Flex天生具備非同步呼叫的能力,使得Flex能夠很好的適應webgis應用中的常用功能,在ArcGIS Flex API中,最典型的莫過於地理要素資訊的動態顯示,例如對於關注的地理要素,當滑鼠移動上去後顯示出該要素的基本資料,ArcGIS Flex API Demo的"Show InfoWindow on mouse hover"就是這樣的例子。
Code
<![CDATA[
import com.esri.ags.geometry.MapPoint;
import com.esri.ags.Graphic;
private const m_content : InfoWindowRollOverContent = new InfoWindowRollOverContent();
override protected function createChildren():void
{
super.createChildren();
map.infoWindow.content = m_content;
map.infoWindow.labelVisible = false;
map.infoWindow.closeButtonVisible = false;
}
private function rollOverHandler( event : MouseEvent ) : void
{
const graphic : Graphic = Graphic( event.target );
const mapPoint : MapPoint = MapPoint( graphic.geometry );
m_content.lat = mapPoint.y.toFixed( 3 );
m_content.lon = mapPoint.x.toFixed( 3 );
map.infoWindow.show(mapPoint);
}
private function rollOutHandler( event : MouseEvent ) : void
{
map.infoWindow.hide();
}
]]>
當滑鼠移動到地理要素(點、線、面)上方時,會調用rollOverHandler方法,顯示出該地理要素的x/y座標,之後由rollOutHandler清除顯示的結果,整個過程不會同步重新整理所有地圖。Flex非同步呼叫的特性和單線程機制,使得我們經常會在Flex中使用回呼函數的方法,如之前寫過的事件監聽:
Code
<?xml version="1.0"?>
<!-- events/SimpleEventHandler.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="initApp();">
<mx:Script><![CDATA[
import mx.controls.Alert;
private function initApp():void {
b1.addEventListener(MouseEvent.CLICK, myEventHandler);
}
private function myEventHandler(event:Event):void {
Alert.show("An event occurred.");
}
]]></mx:Script>
<mx:Button id="b1" label="Click Me"/>
</mx:Application>
Flex中如果希望實現同步,可以考慮WebService Components,非同步呼叫最初會讓人想到是基於效能的一種設計,現在換成WebService似乎走向了另外一個極端,於是出現這樣的設計: "在通過RemoteObject進行資料互動的時候觸發invoke事件,把畫面給鎖住,result的時候解鎖。"
但這隻是RemoteObject在資料互動上同步,在畫面上的動作還是有非同步存在的,對於地圖互動來說,還是非同步設計更貼近實際應用。