ArcGIS API for JavaScript 4.2學習筆記[13] Layer的彈窗(PopupTemplate)


上一篇文章中講到Popup是一個彈窗,是View對象的默認內置彈窗,並且在View對象構造時就順便構造了。

那么這個PopupTemplate是什么呢?

后半截單詞Template是“模板”的意思,我最初理解就是可以定制的彈窗。仔細閱讀API ref后給出更為准確的定義:

PopupTemplate是一個針對Layer和Graphic的彈窗,它與Popup最大的不同的是作用對象不同(Popup主要是針對View)。它服務的對象是Layer中的要素類或者Graphic,它能從要素中獲取字段,並用HTML的語法顯示到彈窗的content屬性中去。

大白話說,PopupTemplate定制程度更高,很多時候復雜的數據顯示都要依靠PopupTemplate而不是簡單的Popup。

查詢得知,PopupTemplate的屬性比較少,但是保留了Popup的重要的屬性,如

actions、content、title

驚奇的發現,PopupTemplate的title和content有別於Popup的title和content,前者的title和content除了string類型外,還可以是一個方法,content更提供了Object[]的支持。這點很重要,對於后面要介紹的PopupTemplate with Function有關,這里先打個招呼,以后會詳細介紹的。

在這個例子中,數據是基於FeatureLayer的。不認識FeatureLayer無妨,就當是桌面版的FeatureLayer即可,擁有簡單的要素類和字段等。


 

給出引用

require(
    [
      "esri/Map",
      "esri/views/MapView",
      "esri/layers/FeatureLayer",
      "dojo/domReady!"
    ],
    function(Map, MapView, FeatureLayer){}
);

函數參數

function(Map, MapView, FeatureLayer){
    var map  = new Map({...});
    var view = new MapView({...});
    var template = {...};
    var featureLayer = new FeatureLayer({...});
    map.add(featureLayer);
}

抽出主干內容后,這個示例代碼就顯得十分簡潔:

1. 照例實例化Map和MapView

2. var一個template匿名對象,這個就是PopupTemplate對象

3. new一個FeatureLayer

4. 把featureLayer添加到map中

最關鍵的部分就是template這個匿名對象的內容和featureLayer這個對象如何與template綁定了,其他都不是難事。

template對象是怎么組織的呢?

仍然是抽取主干,看看template有些什么:

var template = {
    title: "Marriage in NY, Zip Code: {ZIP}",
    content: "...",
    fieldInfos: [{...},{...},{...}]
}

顯而易見,就是PopupTemplate的幾個關鍵屬性:title、content、fieldInfos

前兩個是標題和內容。在content里,就用HTML的語法顯示了“template”的威力:

content: "<p>As of 2015, <b>{MARRIEDRATE}%</b> of the population in this zip code is married.</p>" +
   "<ul><li>{MARRIED_CY} people are married</li>" +
   "<li>{NEVMARR_CY} have never married</li>" +
   "<li>{DIVORCD_CY} are divorced</li></ul>"

熟悉html語法的同學一定不陌生這幾個標簽是什么含義。但是——

{MARRIEDRATE}、{NEVMARR_CY}、{DIVORCD_CY}還有上面title的{ZIP}是什么鬼?

原來,這個就是featureLayer的各個字段名,當彈窗的時候,對應的字段值就會替換這個大括號。

那么fieldInfo里的Object數組又是什么?

fieldInfos: [
    {
      fieldName: "MARRIED_CY",
      format: {
        digitSeparator: true, 
        places: 0 
      }
    }, 
    {
      fieldName: "NEVMARR_CY",
      format: {//同上}
    },
    {
      fieldName: "DIVORCD_CY",
      format: {//同上}
    }
]

這里的//同上是完全相同的意思,為了省略就沒有再寫一次。

看得出,每一個Object里都含有fieldName,看來是和featureLayer的字段的字段名是對應的了。

而format,即格式,內含輸出到彈窗的數字格式,其中digitSeparator就是分隔符,如這樣的數字“10,000,000”,逗號就是分隔符;places就是小數位數。

所以這個fieldInfo也是描述數據及其格式的一個屬性。

那么,template這個PopupTemplate對象(匿名的)如何與featureLayer綁定呢?

彈窗與要素圖層綁定

其實,featureLayer里有一個屬性,叫popupTemplate。這就很容易懂了吧?上代碼:

var featureLayer = new FeatureLayer({
  url: "https://services.arcgis.com/V6ZHFr6zdgNZuVG0/ArcGIS/rest/services/NYCDemographics1/FeatureServer/0",
  outFields: ["*"],
  popupTemplate: template
});

其他什么的先不管,featureLayer這個對象綁定PopupTemplate的方法就是將template對象之間賦值給featureLayer的popupTemplate屬性。

好了,我們來看看結果:

結果很明顯了,剛剛設置的所有格式都在彈窗上有對應的顯示。

MapView中多了一層矢量的圖層,這是featureLayer。(看得出ESRI對矢量圖形的描邊算法還不是很好,尖銳的地方處理的不如桌面版的好,應該是緩沖區算法出的毛病)


總結一下。

給特定的要素圖層或者圖形設置定制好的彈窗步驟如下:

1. 實例化map和view對象

2. 創建PopupTemplate對象,可以匿名創建也可以new創建

3. 創建featureLayer時在構造函數中把popupTemplate屬性賦值即可。

4. map中添加featureLayer

over~!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM