У меня есть веб-сайт, который должен отображать различные данные на карте. Карта всегда будет одинаковой - некоторые области с эффектом «onhover» и всплывающей подсказкой.AngularJS - Огромная директива
Существует около 10 различных наборов данных.
Я создал директиву для отображения карты
Директиву (только нарисовать карту)
angular.module('PluvioradApp.controllers')
.directive('map', function() {
return {
restrict: 'E',
link: function(scope, element, attrs) {
var svg = d3.select(element[0])
.append("div")
.classed("svg-container", true) //container class to make it responsive
.append("svg")
//responsive SVG needs these 2 attributes and no width and height attr
.attr("preserveAspectRatio", "xMinYMin meet")
.attr("viewBox", "0 0 1000 500")
//class to make it responsive
.classed("svg-content-responsive", true);
var g = svg.append("g");
//Scale/translate/...
var lineFunction = d3.svg.line()
.x(function(d) { return (d[0]+50000)/500; })
.y(function(d) { return (-d[1]+170000)/500; })
.interpolate("linear");
//Draw map
var path = g.selectAll('path')
.data(data.areas)
.enter().append("path")
.attr("d", function(d){ return lineFunction(d.borders)})
.attr("fill", "#D5708B")
.on('mouseover', function(d) {
d3.select(this).style('fill', 'orange');
d3.select(this).text(function(d){return "yeah";})
})
.on('mouseout', function(d) {
g.selectAll('path').style('fill', '#D5708B');
});
// zoom and pan
var zoom = d3.behavior.zoom()
.on("zoom", function() {
g.attr("transform", "translate(" + d3.event.translate + ")scale(" + d3.event.scale + ")");
g.selectAll("path")
.attr("d", function(d){ return lineFunction(d.borders)});
});
svg.call(zoom);
}
}
});
Моя идея состояла в том, чтобы получить данные для отображения из контроллера (это происходит от API) и отправить его в директиву. Внутри указанной директивы я добавлю большой switch
или несколько if
, чтобы отобразить правильные данные с правильными цветами, размером, ...
Я уверен, что есть другой способ разделить работу.
Например:
- первая директива для отображения карты. Можно повторно использовать несколько часовых
- 2-й директивы, чтобы отобразить набор 1
- третья директива, чтобы отобразить набор 2
Если это правильный путь, как я могу добиться этого?
Дополнительная информация
У меня есть меню с выпадающего меню, чтобы выбрать, какие данные будут отображаться. На данный момент, пункты перенаправления на страницу, содержащую директиву карты выше
Можете ли вы привести несколько примеров ваших наборов данных? – LkPark
Например, одним из наборов данных будет список координат, каждый из которых содержит разные значения. Это будут маркеры на карте с ярлыками, показывающими значения. Другой набор данных также представляет собой список координат со значениями, которые будут отображаться как цветные пиксели на карте (например, облако) – Weedoze