Виджеты в API Рамблер-Карт

от автора

В этой статье мы поговорим об одной из наиболее многообещающих возможностей API «Рамблер-Карт» — подключении пользовательских виджетов.

Что такое виджеты? Строго говоря, это созданные по шаблону JS-модули для увеличения функциональности API. Выражаясь фигурально, если API — фундамент работы с картами, то виджеты — это дом. И каким он будет — решать вам. Написав собственный виджет, вы можете осуществить свои самые смелые идеи в области картографии.

На данный момент нами уже разработано четыре виджета: «Маршрутизация», «Линейка», «Пробки» и «Камеры». На их примере вполне можно составить представление о том, что такое виджеты API «Рамблер-Карт», зачем они нужны и как работают. Кстати, вы можете прислать нам ваши собственные виджеты и мы разместим их на сайте, чтобы ими могли воспользоваться все!

От слов перейдём к делу. Далее мы поэтапно разберём создание нового виджета, выполняющего простую задачу: после включения выводить возле курсора подсказку с его (курсора) географическими координатами, при щелчке на карте производить обратное геокодирование и показывать в этой подсказке адрес места щелчка, а после выключения — всё прятать.

Итак, создаём виджет. Всё необходимое для его работы передаётся аргументами в метод RMap.registerWidget. Первый аргумент — имя виджета (для последующего обращения к нему), второй — объект с параметрами, на котором остановимся подробно.

Вначале нужно присвоить выходные данные: указать автора, краткое описание виджета и номер версии.

RMap.registerWidget('Location', { 	author: 'Alex.', 	about: 'location tooltip', 	version: '0.0.1', 

Затем — параметр controls, массив элементов управления виджета. В нашем случае это одна кнопка-переключатель (SwitchButton). Среди свойств объекта элемента управления следует выделить важное funcs, состоящее из switchOn и switchOff — это функции, срабатывающие при включении и выключении кнопки. Здесь достаточно передать их имена, мы вернёмся к ним позже.

	controls: [{ 		type: ['SwitchButton'], 		id: 'control', 		groupId: 'loc', 		style: { /* код см. в Location.js */ }, 		funcs: { 			switchOn: 'switchOn', 			switchOff: 'switchOff' 		}, 		params: { 			autoSwitch: false, 			autoSwitchCall: false 		}, 		parent: 'map.controls.groups.loc' 	}], 

Параметр cursors позволяет указать, какие курсоры использовать в тех или иных ситуациях. Скажем, для нашего виджета хватит одного курсора-крестика crosshair, для точного позиционирования.

	cursors: { 		crosshair: { 			cur: false, 			def: "crosshair" 		} 	}, 

Следующий необязательный параметр — eventTypes — типы событий виджета, которые можно использовать, например, для взаимодействия с другими виджетами.

	eventTypes: { 		TURN_ON: "turn on", 		TURN_OFF: "turn off" 	}, 

В параметре handlers устанавливаются связи между событиями и их обработчиками. В нашем виджете четыре обработчика: show (показывает подсказку при наведении курсора на карту), move (перемещает подсказку вслед за курсором), hide (прячет подсказку при выходе курсора за пределы карты или при выключении кнопки) и geocode (преобразует координаты в адрес).

	handlers: { 		show: { 			type: ["mousemove"], 			handler: "show",  			isObject: true, 			sleeped: true 		} 		// остальные обработчки см. в Location.js  	}, 

Параметр tools — список библиотек API, которые используются в виджете. Кстати, напоминаю, что в виджетах можно и даже нужно использовать любые доступные методы API.

	tools: ["JSON", "Events", "util"], 

И, наконец, переменные и функции виджета.

	//переменные 	topP: 5, 	leftP: 5, 	tt: false, 	h: false, 	//функции, используемые как обработчики 	show: function(e) { 		//показывает подсказку 		//код см. в Location.js 	}, 	move: function(e) { 		//перемещает подсказку 		// код см. в Location.js 	}, 	hide: function() { 		//прячет подсказку 		this.tt.style.display = 'none' 	}, 	geocode: function(e) { 		//преобразует координаты в адрес 		//код см. в Location.js 	}, 	//обещанные функции switchOn и switchOff 	switchOn: function() { 		this.handlers.show.activate(); 		this.handlers.hide.activate(); 		this.handlers.geocode.activate(); 		this.cursors.crosshair.show(); 	}, 	switchOff: function() { 		this.handlers.show.sleep(); 		this.handlers.geocode.sleep(); 		this.hide(); 		this.cursors.crosshair.hide(); 	}, 	//функции включения и выключения кнопки 	turnOn: function() { 		this.controls.control.switchOn(); 	}, 	turnOff: function() { 		this.controls.control.switchOff(); 	} 

Полезное примечание — любые публичные функции виджета, например, описанные выше turnOn или turnOff, можно вызывать в скрипте страницы, пользуясь выражением типа map.widgets.Location.turnOn().

Создание виджета окончено. Далее созданный код можно разместить прямо в теле страницы, но (!) гораздо удобнее сохранить его в отдельном JS-модуле и подключить его наряду с API. Тогда для вызова виджета используется метод getWidget, а скрипт на странице сокращается всего до пары строчек.

<script type="text/javascript">	 //создаём карту с отключенными виджетами по-умолчанию var map = new RMap('myMap', {widgets: false});  //подключаем виджет map.getWidget("Location", function () {this.init()} );  </script> 

Полный код примера доступен поссылке http://maps.rambler.ru/api/examples/TutorialWidget.html

ссылка на оригинал статьи http://habrahabr.ru/company/rambler/blog/155071/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *