Как я могу удалить функцию после обратного вызова на openlayers - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь создать код, который может создать функцию и удалить ее, если она не соблюдает некоторые правила. (в этом примере я просто удаляю его сразу после его создания)

Ниже мой код, я создаю карту и разрешаю создавать многоугольник. Затем я пытаюсь удалить его, когда запускается событие.

 init(){
        this.message = "";
        var raster = new TileLayer({
            source: new XYZ({
                url: 'http://mt1.google.com/vt/lyrs=m&x={x}&y={y}&z={z}',
                attributions: [
                '© Google','<a href="https://developers.google.com/maps/terms">Terms of Use.</a>'
                ]
            })
        });

        this.source = new VectorSource();

        this.vector = new VectorLayer({
            source: this.source
        });

        this.map = new Map({
            layers: [raster, this.vector],
            target: 'map',
            view : new View({
                center: [0,0],
                zoom : 4
            })
        }); 

            this.addInteraction();


    }

    addInteraction() {
        var self = this;
        this.draw = new Draw({
            source: this.source,
            type: "Polygon"
        });
        this.draw.on('drawend', function (e) {
            self.message = "";
            self.map.removeInteraction(self.draw);
            self.selectedFeature = e.feature;

            self.removeSelectedFeature();

            // This works but I don't like this solution
            //setTimeout(function(){self.removeSelectedFeature()}, 1);

            self.geoJSON = self.getCoord();
        });
        this.map.addInteraction(this.draw);
    }

    removeSelectedFeature()
    {
        this.source.removeFeature(this.selectedFeature);
        this.selectedFeature = null;
        this.validated = false;
        this.addInteraction();
    }

, но когда я пытаюсь выполнить этот код, я получаю эту ошибку:

core.js:14597 ERROR TypeError: Cannot read property 'forEach' of undefined
    at VectorSource.removeFeatureInternal (Vector.js:951)
    at VectorSource.removeFeature (Vector.js:939)
    at MapComponent.push../src/app/map/map.component.ts.MapComponent.removeSelectedFeature (map.component.ts:106)
    at Draw.<anonymous> (map.component.ts:97)
    at Draw.boundListener (events.js:41)
    at Draw.dispatchEvent (Target.js:99)
    at Draw.finishDrawing (Draw.js:872)
    at Draw.handleUpEvent (Draw.js:578)
    at Draw.handleEvent (Pointer.js:132)
    at Draw.handleEvent (Draw.js:524)

Я знаю, что это потому, что моя функция еще не существует, и она будет создана после завершения события. отсюда мой вопрос, как я могу удалить функцию после ее создания?

  1. Я пытался использовать кнопку события, но это не очень хорошая идея, я хотел бы, чтобы пользователю не нужно было нажимать кнопку для выполнения проверок.
  2. Я пытался использовать setTimeout (как мы можем видеть в моем закомментированном коде), но мне не нравится это решение (даже если оно работает)

Кто-нибудь может объяснить мне, как я могу выполнять эту работу?

Заранее спасибо;)

1 Ответ

1 голос
/ 25 июня 2019

вы пробовали что-то подобное в вашем drawend, если проверка не удалась:

source.once('addfeature', (event) => {
  const feature = event.feature;
  source.removeFeature(feature);
});

это слушает событие addfeature один раз и затем удаляет слушателя.

...