-
Notifications
You must be signed in to change notification settings - Fork 15
Gestión de eventos
La gestión de los eventos en los plugins (extensiones) se suelen iniciar en la fachada del control, después de haber compilado la plantilla en el método createView, ya que necesitamos tener acceso a los elementos html de la interfaz del plugin:
M.control.scaleSelectorControl.prototype.createView = function(map)
{
var this_ = this;
var promise = new Promise(function(success, fail) {
// Compilamos la plantilla
M.template.compile('apicore/plugins/scaleSelector/templates/scaleSelector.html', {
'vars': {'scales':this_.scales_}
}).then(function(html) {
// Una vez tengamos la plantilla compilada tenemos acceso al HTML
this_.addEvents(html);
success(html);
});
});
return promise;
};
En este caso la gestión se realizará en el método addEvents. Dentro del mismo, y teniendo ya acceso a los elementos html de la interfaz del plugin, podemos llamar a tantos métodos de fachada o implementación como sea necesario.
Ejemplo 1 - Nuestro plugin consiste en un selector de escalas, pero en vez de recibirlas como parámetros en el constructor, queremos que se rellene el selector con las escalas del mapa (cuando este está completo):
M.control.scaleselectorControl.prototype.addEvents = function(html)
{
// Obtengo el selector a rellenar
var selector = html.querySelector('select#SelectEscala');
// Cuando el mapa tiene todas sus escalas ya calculadas (M.evt.COMPLETED)
this.map_.on(M.evt.COMPLETED, function() {
// Tengo una funcion para leer las escalas del mapa
this.readMapScales(selector);
}, this);
Ejemplo 2 - Supongamos que queremos además gestionar el evento de selección de escala en el select. Añadiríamos a lo anterior lo siguiente:
var this_ = this;
selector.addEventListener('change', function(e) {
this_.selectEscala();
},this);
También podemos necesitar gestionar eventos de la librería de mapas que estemos usando, lo cual tendría que hacerse siempre en la parte de implementación del plugin, claro está. Supongamos que nuestro plugin necesita ejecutar lógica cuando se produce cambio de vista en el mapa, y que usaremos un evento de la librería base OL en la que tenemos la implementación.
this.map_.on(M.evt.COMPLETED, function() {
this.readMapScales(selector);
// Accedemos a la impl para los eventos de la libreria de mapas
this.getImpl().registerEvents();
}, this);
Y en la implementación del plugin:
M.impl.control.scaleselectorControl.prototype.registerEvents = function() {
if (!M.utils.isNullOrEmpty(this.facadeMap_)) {
// Si cambia el nivel de zoom hay que actualizar la escala
this.facadeMap_.getMapImpl().on('moveend', updateScaleValue, this);
}
};
Es muy importante tener en cuenta que si vinculamos eventos, debemos desvincularlos en caso de que el plugin se elimine del mapa, o podrían ocasionarse errores. Normalmente, el proceso de desvinculación de eventos se iniciará con las destrucción del plugin en su método destroy:
M.plugin.scaleselector.prototype.destroy = function(map) {
this.control_.unregisterEvents();
En la fachada podemos desvincular los eventos, y llamar si es necesario a la desvinculación de eventos de la implementación, en caso de que los hubiera:
M.control.scaleselectorControl.prototype.unregisterEvents = function() {
// desvinculamos eventos de Mapea
this.map_.un(M.evt.NOMBRE_EVENTO);
// desvinculamos eventos de implementacion
this.getImpl().unregisterEvents();
};
Ejemplo:
M.impl.control.scaleselectorControl.prototype.unregisterEvents = function() {
if (!M.utils.isNullOrEmpty(this.facadeMap_)) {
this.facadeMap_.getMapImpl().un('moveend', updateScaleValue, this);
}
};
1.INICIO
1.1. Componentes de la API-CNIG
1.2. Documentación y Puntos de acceso
1.3. Primeros pasos
1.4. Diagrama API CNIG
2.1. Capas
■ 2.1.1. Fuentes
• 2.1.1.1. Capas vectoriales
+ Vector
+ WFS
+ GeoJSON
+ KML
+ MVT
+ OGCAPIFeatures
+ MBTilesVector
+ GenericVector
+ MapLibre
• 2.1.1.2. Capas ráster
+ WMS
+ WMTS
+ TMS
+ XYZ
+ OSM
+ MBTiles
+ GenericRaster
+ GeoTIFF
• 2.1.1.3. Capas rápidas
• 2.1.1.4. Grupo de capas
■ 2.1.2. Simbolización
• 2.1.2.1. Genérica
+ Puntos
+ Líneas
+ Polígonos
• 2.1.2.2. Básica
+ Puntos
+ Líneas
+ Polígonos
• 2.1.2.3. Avanzada
+ Coropletas
+ Proporcional
+ Categorías
+ Estadísticos
+ Mapas de Calor
+ Cluster
+ Línea de flujo
+ Composición
2.4. Paneles
» Creación de panel desde cero sin controles
» Tutorial Panel de un único control
5. API REST
5.1. Parametrización API-REST
5.2. Base de Datos API-REST
5.3. API REST Actions
5.4. Servicio de correos electrónicos
5.5. Capas rápidas
6. PARAMETRIZACIÓN VISUALIZADORES
9. GUÍA DE DESARROLLO
> Guía para el desarrollo de API-CNIG
» Tutorial desarrollo del núcleo de API-CNIG - (Cliente)
> Guía de desarrollo de componentes
» Tutorial desarrollo del núcleo de API-CNIG - (Servidor)
> Guía de desarrollo de plugins
» Tutorial desarrollo de plugins ya creados
» Tutorial desarrollo de nuevos plugins
> Guía de desarrollo de visualizadores con React