OpenLayers: я не могу получить возможности VectorSource вне слушателя событий? - PullRequest
0 голосов
/ 15 марта 2019

Я пытаюсь показать только определенную функцию из моего векторного источника.поэтому я делаю такую ​​функцию:

function showUtility(id) {
        utilitiesSource.forEach(function(i) {
            //console.log(i.getFeatures());
            i.forEachFeature(function(f) {
                if (f.getProperties().id == id) {
                    f.setStyle(null);
                } else {
                    f.setStyle([]);
                }
            });
        });
}

, откуда берется utilitiesSource:

utilitiesSource = [];

var utilitySource = new ol.source.Vector({
                format: new ol.format.GeoJSON(),
                projection: 'EPSG:4326',
                url: 'someUrl',
                extractStyles: false
        });

utilitiesSource.push(utilitySource);

проблема в том, что console.log(i.getFeatures()) в showUtility() всегда даетпустой массив, хотя это нормально, если бы я использовал его в EventListener, как эти:

    var selectCtrl = new ol.control.Select({
        source: utilitiesSource,
        property: $(".options select").val(),
        selectLabel: 'Cari',
        addLabel: 'Tambah Kondisi',
        allLabel: 'Cocokkan Semua',
        attrPlaceHolder: 'atribut',
        valuePlaceHolder: 'nilai'
    });

 selectCtrl.on('select', function(e) {
        select.getFeatures().clear();
        utilitiesSource.forEach(function(i) {
            //console.log(i.getFeatures()); --> gives array of feature
            i.forEachFeature(function(f) {
                f.setStyle([]);
            });
        })
        e.features.forEach(function(f) {
            f.setStyle(null);
        });
    });

    var bar = new ol.control.Bar({ 
      group: true,
      controls: [
        selectCtrl,
        new ol.control.Button({
          html: '<i class="fa fa-undo" ></i>',
          title: 'Reset',
          handleClick: function() {
            select.getFeatures().clear();
            utilitiesSource.forEach(function(i) {
                //console.log(i.getFeatures()); --> gives array of feature
                i.getFeatures().forEach(function(f) {
                    f.setStyle(null);
                });
            })
          }
        })
     ]});

и если я использую консоль браузера и выполняю utilitiesSource.forEach(function(i) { i.getFeatures().forEach(function(j){ if (j.getProperties().id == 100) {j.setStyle(null);} else {j.setStyle([])} });}); я получаю то, что я хочу

почему это?почему я не могу получить функции в showUtility (id)?

1 Ответ

0 голосов
/ 15 марта 2019

(по-прежнему недостаточно репутации, поэтому мне приходится неловко задавать вопросы в комментариях -.-)

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

...