geo-targeting-component
Version:
Geo targeting component
124 lines (112 loc) • 4.9 kB
JavaScript
(function () {
'use strict';
angular.module('geoTargetingModule', ['yaMap'])
.component('geoTargetingComponent', {
bindings: {
model: '=',
options: '<'
},
template:'<div class="geo-targeting-component"><ya-map ya-after-init="$ctrl.getMap($target);" ya-zoom="10" ya-controls ya-center="$ctrl.options.coordinates" style="width: 600px; height: 600px; display: inline-block;"><ya-geo-object ya-after-init="$ctrl.getCircle($target);" ya-source="$ctrl.options.object" ya-options="{draggable: true, fillColor: \'#ffc53877\',strokeColor: \'#ffc538\',strokeOpacity: 0.8,strokeWidth: 1}"></ya-geo-object></ya-map></div>',
controller: ['$timeout', geoTargetingController]
});
function geoTargetingController($timeout) {
var vm = this;
vm.circle = {};
vm.map = {};
vm.model = {};
vm.options = {
zoom: 10,
coordinates: [37.64, 55.76],
object: {
geometry: {
type: 'Circle',
coordinates: [37.60, 55.76],
radius: 5000
},
properties: {
hintContent: "Подвинь меня"
}
},
defaultAddress: ''
};
vm.$onInit = function() {
console.log('init');
};
vm.getCircle = function (target) {
vm.circle = target;
vm.model.coordinates = vm.options.coordinates;
vm.circle.geometry.setCoordinates(vm.model.coordinates);
vm.model.setRadius = function(radius) {
radius = parseInt(radius);
vm.circle.geometry.setRadius(radius * 1000);
vm.model.radius = radius;
};
vm.model.getRadius = function () {
return vm.circle.geometry.getRadius() / 1000;
};
vm.circle.events.add('dragend', function (e) {
vm.model.coordinates = vm.circle.geometry.getCoordinates();
vm.tryFindAddrByCoords(vm.model.coordinates);
});
$timeout(function () {
vm.model.setRadius(vm.options.object.geometry.radius);
}, 0);
if (vm.options.address) {
vm.model.findByAddress(vm.options.address);
} else if (vm.options.coordinates) {
vm.model.setCoordinates(vm.options.coordinates);
} else {
vm.model.setCoordinates([37.64, 55.76]);
}
if (vm.options.onInit) {
vm.options.onInit();
}
};
vm.getMap = function (target) {
vm.map = target;
vm.map.events.add('click', function (e) {
var coords = e.get('coords');
vm.model.coordinates = coords;
vm.circle.geometry.setCoordinates(vm.model.coordinates);
vm.tryFindAddrByCoords(vm.model.coordinates);
});
vm.model.findByAddress = function(address) {
vm.tryFindByAddr(address);
};
vm.model.setCoordinates = function(coordinates) {
vm.map.setCenter(coordinates);
vm.tryFindAddrByCoords(coordinates);
};
};
vm.tryFindByAddr = function (address) {
ymaps.geocode(address, {
results: 1
}).then(function (res) {
if (res) {
var firstGeoObject = res.geoObjects.get(0),
coords = firstGeoObject.geometry.getCoordinates(),
bounds = firstGeoObject.properties.get('boundedBy');
if (bounds) {
vm.model.address = firstGeoObject.getAddressLine() ? firstGeoObject.getAddressLine() : 'Не удалось определить адрес.';
vm.model.coordinates = coords;
vm.circle.geometry.setCoordinates(coords);
vm.map.setCenter(coords);
vm.tryFindAddrByCoords(coords);
}
}
});
};
vm.tryFindAddrByCoords = function (coords) {
ymaps.geocode(coords).then(function (res) {
var firstGeoObject = res.geoObjects.get(0);
if (firstGeoObject.getAddressLine()) {
$timeout(function () {
vm.model.address = firstGeoObject.getAddressLine() ? firstGeoObject.getAddressLine() : 'Не удалось определить адрес.';
}, 0);
}
vm.model.coordinates = coords;
vm.circle.geometry.setCoordinates(coords);
});
};
}
})();