#javascript #google-maps #google-maps-api-3
#javascript #google-карты #google-maps-api-3
Вопрос:
Я пытаюсь реализовать класс для обработки Multipolygon (полученный из спецификации OpenGIS Multipolygon). Моей основной целью было расширить MVCObject и внутренне управлять массивом google.maps.Полигон. Но когда я пытаюсь привязать свойства моего Multipolygon (с помощью метода .bindTo) к базовым полигонам в цикле, кажется, что только последний полигон окончательно привязан.
google.maps.MultiPolygon.prototype = new google.maps.MVCObject();
...
for (var n = 0; n < this.polygons.length; n )
{
for (var i in MultiPolygonOptions) this.bindTo(i, this.polygons[n], i);
}
...
Можно ли привязать свойство MVCObject к нескольким целям в Google Maps v3? Если нет, может быть, есть какие-то обходные пути? Спасибо.
Ответ №1:
Как я полагал, после некоторого незаконного копания исходного кода gmaps puzzly стало ясно — невозможно добавить несколько целей при привязке некоторого ключа с помощью MVCObject.bindTo.
Но я обнаружил некоторое обходное решение. Я поставил цели (полигоны) Я хотел привязать к MVCArray, затем привязать массив к свойству, используя SomeObject.bindTo(your_key, MVCArray_with_targets). Затем я подключил функцию изменения массивов для прослушивания и передачи измененных свойств элементам массива. Конечно, это работает только одним способом, но в моем случае этого достаточно.
google.maps.MultiPolygon = function(options)
{
var self = this;
...
var gpolys = new google.maps.MVCArray();
// creating polygons from paths
polysOptions.forEach(function(value, number)
{
gpolys.push(self.__createPolygon(value));
});
// bind all parent properties to array and set it before (or this turns parent keys undefined)
for (var i in MultiPolygonOptions) { gpolys.set(i, this.get(i)); this.bindTo(i, gpolys); }
// pass changes to array members which is google.maps.Polygon instances
gpolys.changed = function(prop)
{
this.forEach(function(poly)
{
poly.set(prop, self.get(prop));
});
}
this.set('polys', gpolys);
}
google.maps.MultiPolygon.prototype = new google.maps.MVCObject();
Теперь я могу контролировать внешний вид всех дочерних полигонов в моем MultiPolygon в одном месте, как и в случае с simple Polygon.
var mpoly = new google.maps.MultiPolygon({ options });
mpoly.setMap(map);
mpoly.setValues({
fillOpacity: 0.5,
fillColor: 'yellow'
});