【转】ArcGIS.Server.9.2.DotNet的ADF的Toolbar工作过程分析
目的:
1.ArcGIS.Server.9.2.DotNet的ADF的Toolbar工作過程原理。
開始:
Toolbar工作過程:
一.初始化過程(在頁面生成的時候Toolbar控件會生成和它相關(guān)的html代碼和javascript代碼):
???? 1.根據(jù)每一個子Tool生成一個<TD>...</TD>,并且這個TD元素添加onMouseDown、onMouseOver、onMouseOut三個鼠標(biāo)事件,這樣使得TD可以點擊執(zhí)行不同的功能。
???? 2.在javascript中初始化Toolbar1_Items數(shù)組,用ToolbarItemObject初始化每一個子Tool添加到Toolbar1_Items數(shù)組中。
???? 3.初始化Toolbars數(shù)組,用ToolbarObject初始化Toolbar1添加到Toolbars數(shù)組中。
???? 4.初始化ToolbarGroups數(shù)組,ToolbarGroupObject初始化添加到ToolbarGroups數(shù)組。
???? 5.對Toolbar1對象賦一些初始化屬性。
二.執(zhí)行過程(從點擊到提交服務(wù)端的整個過程):
?????1.當(dāng)Toolbar的Tool被點擊時會執(zhí)行onMouseDown事件的ToolbarMouseDown方法,這個方法定義在ADF的display_toolbar.js中,對于onMouseOver、onMouseOut這2個事件沒有實質(zhì)性的功能是顯示效果的切換而已。
???? 2.ToolbarMouseDown方法執(zhí)行會根據(jù)點擊的Tool類型進(jìn)行不同的處理,對于Command和DropDownBox類型的Tool就調(diào)用postBack方法直接向服務(wù)端進(jìn)行提交而且對于Tool類型的Tool則根據(jù)ClientAction類型調(diào)用不同的方法設(shè)置地圖的操作狀態(tài)。
???? 3.Tool類型的Tool的ClientAction類型內(nèi)置了很多如Point、Line、Polyline等根據(jù)這個類型會分別調(diào)用MapPoint、MapLine、MapPolyline等方法設(shè)置地圖的操作狀態(tài),這些MapPoint方法等是定義在ADF的display_map.js文件中,這些方法執(zhí)行會調(diào)用map對象的setTool的方法設(shè)置地圖操作狀態(tài)。
???? 4.設(shè)置完地圖操作狀態(tài)就接下來,是進(jìn)行地圖操作了該畫點的就畫點該畫線的就畫線了。這些操作是對地圖進(jìn)行操作了那么這些操作代碼肯定是在map對象上了,上面的setTool的方法會為map對象的divObject設(shè)置onmousedown事件。
???? 5.接著往下執(zhí)行onmousedown事件調(diào)用方法MapMouseDown,這個方法會根據(jù)操作類型是結(jié)束操作提交結(jié)果還是繼續(xù)設(shè)置onmouseup和onmousemove,這個是根據(jù)操作類型決定,比如一次性操作的畫點到這里就結(jié)束操作調(diào)用postBack方法向服務(wù)端提交結(jié)果,而連續(xù)操作的畫線到這里還需要往下操作就設(shè)置onmouseup和onmousemove。
???? 6.最后就執(zhí)行onmouseup事件的方法MapMouseUp向服務(wù)端提交操作結(jié)果完成所有動作。
???? 7.上面無論哪種類型的操作殊途同歸最終都是需要調(diào)用postBack方法向服務(wù)端提交結(jié)果完成操作,這個postBack方法定義在ADF的display_dotnetadf.js文件中。
???? 8.繼續(xù)看postBack方法,這個方法執(zhí)行會調(diào)用clientPostBack方法,這個方法是通過eval(callBackFunctionString)方法實現(xiàn)向服務(wù)端的提交,跟蹤調(diào)試可以看到eval(callBackFunctionString)其實就是執(zhí)行WebForm_DoCallback('Map1',argument,processCallbackResult,context,postBackError,false)這樣的方法,到這里一切都明朗了,ADF的類庫最終也是通過這種方式像服務(wù)端提交數(shù)據(jù)了,這個和我們自己用Page.ClientScript.GetCallbackEventReference方法產(chǎn)生腳本字符串放在客戶端執(zhí)行一樣。
???? 9.現(xiàn)在把ADF產(chǎn)生的WebForm_DoCallback和我們自己用Page.ClientScript.GetCallbackEventReference方法的做一個比較:
??????? ADF: WebForm_DoCallback('Map1',argument,processCallbackResult,context,postBackError,false)
??????? 自己:WebForm_DoCallback('__Page',argument,processCallbackResult,context,processCallbackError,true)
????10.看上面這2個方法最大的區(qū)別就是請求的目標(biāo)對象不同一個是“Map1”控件一個是“__Page”頁面了,由此可見“Map1”控件肯定實現(xiàn)了ICallbackEventHandler的接口
?,它能處理ADF腳本方法提交的請求。
??? 11.更進(jìn)一步,我們在使用Toolbar控件時可以為Tool設(shè)置處理的類功能,就是給Tool設(shè)置ServerActionAssembly和ServerActionClass屬性,這樣就說明Map控件還具有一個功能就是能根據(jù)發(fā)起請求的Tool不同載入我們定義的ServerActionClass類來處理Tool的請求,這樣就達(dá)到了讓用戶自己定義Tool的服務(wù)端的處理功能。
?總結(jié):通過對Toolbar工程流程的分析的目的就是能用自己的方式來靈活實現(xiàn)Toolbar的功能而不需要使用死板的Toolbar控件,這個是在前一篇(ArcGIS.Server.9.2.DotNet實現(xiàn)類似GoogleMap的操作工具條(ADF的Toolbar太丑))的延續(xù)尋找更加優(yōu)雅的解決方法。
???????? 根據(jù)上面的流程分析要拋開Toolbar控件有2個工作:第一個就是更改腳本端WebForm_DoCallback提交時的目標(biāo)對象把原先的"Map1"控件改成我們自己的實現(xiàn)了ICallbackEventHandler接口頁面或者自己的控件。第二個就是讓我們的頁面或控件能實現(xiàn)類似Map1控件的載入ServerActionClass類這樣的功能。這個只是初步才想法了,具體的實現(xiàn)下一篇在寫。
原文出處:http://www.cnblogs.com/hll2008/archive/2008/10/04/1303713.html
轉(zhuǎn)載于:https://www.cnblogs.com/aooyu/archive/2009/11/06/1597185.html
總結(jié)
以上是生活随笔為你收集整理的【转】ArcGIS.Server.9.2.DotNet的ADF的Toolbar工作过程分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: coolite TreeNode Nod
- 下一篇: PHP 的历史