結構清楚了,寫啥都有個底。
【回顧與本篇預覽】
上篇簡單介紹了JsAPI中的資料與視圖,并告訴大家這兩部分有什麼用、如何有機連接配接在一起。
這一篇快速介紹一下前端代碼的骨架。當然,假定你已經熟悉HTML5、CSS3和JavaScript(最好了解一下ES6)
轉載請注明出處,部落格園/CSDN/bilibili:秋意正寒
目錄:https://www.cnblogs.com/onsummer/p/9080204.html
1. 代碼
為了友善示範,我将js代碼和css代碼全都寫在一個html檔案裡,當然,更合适的做法是三者分離,不過要注意引用的順序哦。
使用上篇三維視圖的代碼↓
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no">
<title>Intro to SceneView - Create a 3D map - 4.7</title>
<style>
html,
body,
#viewDiv {
padding: 0;
margin: 0;
height: 100%;
width: 100%;
}
</style>
<link rel="stylesheet" href="https://js.arcgis.com/4.7/esri/css/main.css">
<script src="https://js.arcgis.com/4.7/"></script>
<script>
require([
"esri/Map",
"esri/views/SceneView",
"dojo/domReady!"
], function(Map, SceneView) {
var map = new Map({
basemap: "streets",
ground: "world-elevation"
});
var view = new SceneView({
container: "viewDiv",
map: map,
scale: 50000000,
center: [-101.17, 21.78]
});
});
</script>
</head>
<body>
<div id="viewDiv"></div>
</body>
</html>
三維視圖代碼
2. HTML組成/CSS簡單解釋
先把标簽都折疊,過一下HTML的組成。
什麼?你說你不喜歡看代碼?那怎麼行,得培養梳理代碼的能力。我在這繼續用圖解法,剖析頁面結構:
其中,第二個script标簽是我們自己的代碼。
link标簽用于引用官方預設css,沒有它頁面不能工作。
第一個script标簽用于引用JsAPI的核心檔案。
注意到,body是整個頁面的組織,在這裡隻有一個id為viewDiv的div,用于承載視圖。
在link标簽上還有這麼一個style樣式标簽,是對頁面樣式的預設,其實很簡單,僅僅是對html的一些元素做無邊框處理而已。
3. script标簽的内容
把js代碼折疊後,是這樣的:
收縮起的代碼上篇已經解釋過了,map是資料,view是視圖,view通過SceneView類的構造函數中的傳參中的map屬性進行連通,這裡就不再複述。
結構圖是這樣的:
require()是JsAPI的基礎——Dojo架構規定的一個全局入口,與初學C語言時接觸的main()函數類似。
3.1 類引用清單
第一個參數,是一個字元串數組。它規定了接下來的代碼需要用哪些類(官方說法叫子產品),用字元串描述了所需類(子產品)所在的包路徑。與C#中using 命名空間;類似。
如"esri/views/SceneView"就代表引用esri這個包下的views這個包裡的SceneView這個類。不妨在浏覽器調試視窗中看看資源:
因為第一個script标簽引用的位址是“https://js.arcgis.com/4.7/”,是以esri這個包就是基于此目錄下的相對路徑了。
同理,"esri/Map"也是這樣引用的一個類。
至于"dojo/domReady!"這個,則是dojo架構的一個特殊類(子產品),是以會在"domReady"後加一個歎号,這是dojo的一個插件,代表DOM加載完成後再執行後面的代碼。
3.2 回調函數
回調函數的形參清單除了"dojo/domReady!"這個特殊的之外,均要與類引用清單中的類順序上一一對應,但是名字可以自由,一般與官方的類名一緻。
至于本例中回調函數的内容,上篇講過啦。
既可以用Lambda表達式,也可以在外部定義函數,傳函數名進require()中。
對了,上篇沒講如何将SceneView與HTML元素綁定的,其實隻是SceneView構造函數中的一個屬性而已:
container屬性利用id選擇器(不用寫#)選擇div。
scale是比例尺,center是中央經緯度。
3.3 總結
由于AMD規範的要求,require()就是這麼一個異步操作。你要告訴背景,你要用哪些功能(參數1,類引用清單),你要拿這些功能做什麼(參數2,回調函數)。
回調函數就代表,等相關的資源準備好後,再根據此回調函數做事情。回調函數中仍存在很多異步操作,這就是ES6中Promise的用法了,when()異步鍊使得異步操作寫起來更友善,如果對異步和回調有什麼不懂的,請到網上查資料學習,在此不展開了——但是,異步操作仍然是JsAPI中極為重要的一個技術。
4. 骨架整理圖&總結
總結就是,require()這個唯一入口,帶了一個引用清單(字元串數組),帶了一個回調函數。
回調函數裡寫你需要做的事情,當然,回調的形參要與引用清單一一對應。
以下是骨架圖。
本篇到此結束,有了這個骨架,後面隻是在script标簽裡加自己的内容而已。
待工程茁壯到一定規模的時候,dojo的子產品化技術才能用得上,那并不是本入門教程的内容了。
背景也交代完了,下篇進入約定好的幾個部分的API的講解。