Я использую Leaflet JS для рисования полигонов на карте.
Я могу рисовать фигуры и сохранять фигуры в базе данных в формате GeoJSON следующим образом:
.ts file
...
let layer = event.layer;
let geometry = layer.toGeoJSON();
this.drawLayer.addLayer(layer);
}
Я вызываю метод в методе ngOnInit
для перерисовки фигур:
drawPolygonShape(data) {
if (data.polygon.geometry) {
let shape = {
type: data.polygon.type,
geometry: {
type: data.polygon.geometry.type,
coordinates: data.polygon.geometry.coordinates
},
properties: {}
};
L.geoJSON(shape, {
onEachFeature: this.onEachFeature
}).addTo(this.myMap);
}
}
...
onEachFeature(feature, layer) {
layer.on('click', event => {
// layer.bindPopup('Hello World'); // Works great
let popover = this.popoverCtrl.create('MyComponent', { layer: layer });
popover.present();
});
}
Я импортирую MyComponent
в файл модуля, поэтому я знаю, что он доступен. Тем не менее, я всегда получаю следующее сообщение об ошибке:
Невозможно прочитать свойство 'create' из неопределенного
Итак, где-то есть проблема с синхронизацией или областью действия, которая некорректно работает с событием click.
Кажется, это проблема области видимости, поскольку любой компонент выдает ту же ошибку. Любые предложения с благодарностью!
EDIT
Спасибо @ghybs. Я пытался добавить this
в качестве третьего аргумента к событию click, но я все еще получаю ту же ошибку:
onEachFeature(feature, layer) {
layer.on('click', event => {
// layer.bindPopup('Hello World'); // Works great
let popover = this.popoverCtrl.create('MyComponent', { layer: layer });
popover.present();
}, this);
}
РЕДАКТИРОВАТЬ 2
Спасибо, @ghybs!
Мне интересно ваше второе предложение - я настраиваю карту следующим образом:
let mapOptions: any = {
position: 'topright',
draw: {
polyline: false,
...
}
}
...
let drawControl = new L.Control.Draw(mapOptions);
this.myMap.addControl(drawControl);
this.myMap.on(L.Draw.Event.CREATED, this.onCreatePolygon.bind(this));
Теперь .bind(this)
имеет больше смысла - onCreatePolygon
- это метод, который я использую для сохранения формы.
Как вы предлагаете мне делегировать событие click для каждой фигуры?
this.myMap.on(L.Draw.Event.CLICK, this.MYCLICKHANDLER.bind(this));
(очевидно, я не знаком с этим, поэтому я ценю все ваше время.)