1.应用场景:

我们知道ArcGIS JS API自带了一些微件(或者说是控件),比如缩放按钮、定位按钮等等。但是有的时候这些微件的样式不太符合项目实际要求,或者是项目上想要把这些组合起来,这时候我们就需要自己封装一套微件了。下面用一个工具条微件作为例子,总结一下过程,效果图:

2.封装步骤:

一个微件可以用一个dojo模块表示,在dojo模块中定义一个类,使用时直接实例化类就可以了。最后有整段代码。

2.1 定义模块

通过define定义模块,基本格式:

define([依赖模块],function(){//回调函数return 0;  //下步会定义一个类,返回
});

封装微件一般会依赖这几个模块:

"dijit/_WidgetBase",//微件基类
"dijit/_TemplatedMixin",
"dijit/_OnDijitClickMixin",

2.2 定义类

通过declare定义类,基本格式:

declare("类名",[依赖的类],{//类的主体//定义基本属性,构造方法等
});

2.3 定义html模板

微件需要通过DOM节点进行展示,要先定义好基本模板,Toolbar.html

<ul class="toolbar"><li><img src="./Toolbar/assets/放大.png" title="放大" data-dojo-attach-event="ondijitclick:mapZoomIn"></li><li><img src="./Toolbar/assets/缩小.png" title="缩小" data-dojo-attach-event="ondijitclick:mapZoomOut"></li><li><img src="./Toolbar/assets/平移.png" title="平移" data-dojo-attach-event="ondijitclick:mapPan"></li><li class="no-border"><img src="./Toolbar/assets/全图.png" title="默认视图" data-dojo-attach-event="ondijitclick:mapZoomToFullExtent"></li>
</ul>

2.4 定义样式

为了让微件布局更好看,需要css样式,Toolbar.css

div,ul,li{padding: 0;margin: 0;list-style: none;
}.toolbar{position: absolute;top: 20px;right: 300px;height: 42px;width: 172px;overflow: hidden;background-color: #fff;border-radius: 8px;-moz-box-shadow: -6px 6px 5px #cccccc;-webkit-box-shadow:-6px 6px 5px #cccccc;box-shadow: -6px 6px 5px #cccccc;
}
.toolbar>li{float: left;position: relative;height: 26px;width: 41px;border-right: 2px solid #f5f5f5;margin: 8px 0 0 0;cursor: pointer;
}
.toolbar>li.no-border{border: 0;width: 40px;
}

2.5 添加属性、构造函数、基本方法

Toolbar.js

define(["dojo/_base/declare","esri/toolbars/navigation","dijit/_WidgetBase","dijit/_TemplatedMixin","dijit/_OnDijitClickMixin","dojo/text!./templates/Toolbar.html",
], function (declare,Navigation,_WidgetBase,_TemplatedMixin,_OnDijitClickMixin,template,
) {return declare([_WidgetBase,_TemplatedMixin,_OnDijitClickMixin], {_map: null,_naviBar: null,templateString:template,//html模板constructor: function (options) {var me = this;me._map = options.map;me._naviBar = new Navigation(me._map);},//平移mapPan: function() {this._naviBar.activate(Navigation.PAN);},//地图放大mapZoomIn: function() {this._naviBar.activate(Navigation.ZOOM_IN);},//地图缩小mapZoomOut: function() {this._naviBar.activate(Navigation.ZOOM_OUT);},//缩放至全图mapZoomToFullExtent: function() {this._naviBar.zoomToFullExtent();},});
});

2.6 测试

注意:要使用自己封装的本地模块,必须添加dojo配置,否则在加载模块时会找不到

index.html

<!DOCTYPE html>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no"/><title>My Dijit</title><link rel="stylesheet" href="https://js.arcgis.com/3.27/esri/css/esri.css"><link rel="stylesheet" href="Toolbar/style/Toolbar.css"><style>html, body, #map {height: 100%;margin: 0;padding: 0;}</style><script>var package_path = window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/'));var dojoConfig = {// The locationPath logic below may look confusing but all its doing is// enabling us to load the api from a CDN and load local modules from the correct location.packages: [{name: "myDijit",location: package_path + '/Toolbar'}]};</script><script src="https://js.arcgis.com/3.27/"></script><script>var _map,_toolbar;require(["esri/map","myDijit/Toolbar","dojo/domReady!"], function(Map,Toolbar) {_map = new Map("map", {basemap: "topo",  //For full list of pre-defined basemaps, navigate to http://arcg.is/1JVo6Wdcenter: [-122.45, 37.75], // longitude, latitudezoom: 13});var mapDiv = document.getElementById("map");var mapToolDiv = document.createElement('div');mapToolDiv.id = 'mapToolbar_';var options = {map:_map,};_toolbar = new Toolbar(options);// new Toolbar(options,srcDomRef);_toolbar.placeAt(mapToolDiv);mapDiv.appendChild(mapToolDiv);});//https://developers.arcgis.com/javascript/3/jshelp/intro_custom_dijit.html//https://github.com/Esri/arcgis-dijit-home-button-js//https://dojotoolkit.org/reference-guide/1.10/quickstart/writingWidgets.html#//构造方法,var params={}//<!--注意html模板内的DOM节点属性应采用dojo可识别的,如单击监听事件data-dojo-attach-event="ondijitclick:,而不是(onclick)--></script>
</head><body>
<div id="map"></div>
</body>
</html>

3. 踩坑提醒:

3.1 dojoConfig要在引入init.js文件之前先加上,否则配置不会生效;

3.2 微件类的构造函数传参时不要直接把map对象传进去,要用对象包一层:

var toolbar = new Toolbar(_map);//有问题var options = {map:_map}
var toolbar = new Toolbar(options);//正常constructor: function(options){map = options.map;
}

3.3 注意html模板内的DOM节点属性应采用dojo可识别的,如单击监听事件data-dojo-attach-event="ondijitclick:,而不是onclick,直接用οnclick="fun1()"是没作用的。

<!--点击无反应-->
<img src="./Toolbar/assets/平移.png" title="平移" onclick="mapPan ()"><!--点击正常-->
<img src="./Toolbar/assets/平移.png" title="平移" data-dojo-attach-event="ondijitclick:mapPan">

源代码下载地址:https://download.csdn.net/download/wml00000/10972736

参考资料链接:

https://developers.arcgis.com/javascript/3/jshelp/intro_custom_dijit.html

https://github.com/Esri/arcgis-dijit-home-button-js

https://dojotoolkit.org/reference-guide/1.10/quickstart/writingWidgets.html#

基于ArcGIS JS API封装dojo微件(以工具条为例)相关推荐

  1. 基于ArcGIS JS API实现的两种距离和面积测量方式

    文章目录 前言 开发思路 主要代码 效果测试 效果图 测试页面 开发总结 参考链接 前言 在一些地图地图应用中,距离.面积测量属于基础功能.ArcGIS API for JavaScript有单独提供 ...

  2. 基于ArcGIS JS API实现垂直滑动缩放条

    文章目录 需求背景 需求分析 效果图 完整代码 注意事项 严格来说并不是基于ArcGIS JS API,应该是基于Dojo的dijit里面的VerticalSlider和VerticalRule,但是 ...

  3. 基于ArcGIS JS API 4.11实现对FeatureLayer的多变量渲染

    文章目录 需求背景 需求分析 开发过程 效果图 注意事项 参考链接 在线示例 需求背景 有一个二维数组,里面包含几万个表示高度的值,现在要把这些高度值在地图上展示出来.可以通过小立方体的方式展现,长宽 ...

  4. 基于ArcGIS JS API 的点击查询功能

    应用场景: 点击地图要素,弹出信息窗,左边显示点击要素的图层树(因为是查询的多个图层),右边显示当前所选要素的所有属性数据,可通过树插件实现动态控制要显示的要素.如果不想把属性表里面的所有属性全部显示 ...

  5. 基于three.js 和ArcGIS JS API 建筑物立面动态特效渲染

    基于three.js 和ArcGIS JS API 建筑物立面波纹墙动态渲染 简介 基于ArcGIS JS API 和 three.js 波纹墙扩展类ripplewallRenderer 波纹墙扩展类 ...

  6. 15 ArcGIS JS API 4.17更改测量控件黄白相间的默认样式

    问题描述 在使用ArcGIS API for JavaScript 4.17开发项目时,有一个需求是需要在地图上添加距离测量和面积测量的控件,这其实很简单,直接调用ArcGIS JS API自带的测量 ...

  7. 三维地图前端arcgis_【ArcGIS JS API + eCharts系列】实现二、三维网络路径图的绘制...

    概述 前面两篇文章通过扩展EchartsLayer.js这个图层类,实现了使用ArcGIS JS API和eCharts,在二维和三维场景下绘制迁徙图和散点图.这篇文章继续通过绘制网络路径图的例子,再 ...

  8. 03 【ArcGIS JS API + eCharts系列】实现二、三维散点图的绘制

    概述 上一篇文章中我们介绍了如何使用ArcGIS JS API和eCharts结合,在二维和三维场景下绘制迁徙图.这篇文章我们来介绍下如何在二维和三维场景下绘制散点图,其实散点图跟迁徙图一样,它的绘制 ...

  9. 02 【ArcGIS JS API + eCharts系列】实现二、三维迁徙图的绘制

    概述 上一篇文章通过纯前端的方式实现了ArcGIS JS API和eCharts的普通二维图表绘制,因为这些图表绘制其实是跟地理坐标无关的,只需要设置图表的位置即可,所以仅仅用了纯前端的方式去实现.这 ...

最新文章

  1. 自定义报错返回_Keras编写自定义层--以GroupNormalization为例
  2. 牛X!Github项目中文榜,你想知道不想知道的都有!
  3. 用Apache Server配置php,cgi服务器
  4. [No0000C0]百度网盘真实地址解析(不用下载百度网盘)20170301
  5. python爬虫模块取cookie_[ Python爬虫实战 ] Python使用cookies - pytorch中文网
  6. edoc2中标电子文件管理标准ERMS制定项目
  7. 解决matplotlib的中文问题
  8. 使用Gensim进行主题建模(二)
  9. TCP BBR - 一键安装最新内核并开启 TCP BBR
  10. Vscode tab键使用
  11. 六行shell脚本实现Android手机自动刷抖音极速版
  12. java毕业设计——基于java+java-swing的泡泡堂网络游戏设计与实现(毕业论文+程序源码)——泡泡堂网络游戏
  13. redis集群工具redis-trib制作并打包上传到私有Harbor
  14. 通过游戏,ACCU和乌克兰进行测试
  15. DNS劫持、流量劫持,HTTP/HTTPS劫持
  16. iphone6+总显示无服务器,iphone6一直显示无服务为什么啊
  17. 如何设计手机端banner图【电商小白】
  18. 【学习OpenCV4】OpenCV入门精讲(C++/Python双语教学)
  19. 高中信息技术c语言编程题,高中信息技术招聘C语言编程题精选.doc
  20. 【线代】转置、共轭转置

热门文章

  1. MFC 多文档中同时打开多个文档
  2. 汇总运行在Hadoop YARN上的开源系统
  3. Day 22: 使用Spring、MongoDB和AngularJS开发单页面应用
  4. Machine Learning week 6 quiz: Advice for Applying Machine Learning
  5. Android我的便签-----SQLite的使用方法
  6. hash_hmac函数使用不当造成的安全问题
  7. Android图表和图形创建库:EazeGraph
  8. NO.111 禅道导出数据做透视表,让你轻松做年终工作总结。
  9. sscanf函数中类型不匹配警告引发的BUG和思考
  10. Simulink中进行电容充放电的一种简单仿真