OpenLayers: не могу ли я получить функции VectorSource вне прослушивателя событий?

#javascript #openlayers #openlayers-5

#javascript #openlayers #openlayers-5

Вопрос:

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

 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. Вы уверены, что векторные источники загрузили свои функции при вызове showUtility(id) метода?

2. я уверен, что мои слои, источником которых является содержимое utilitiesSource, отображаются идеально. я также пытался вызвать функцию в последней строке моего кода, но по-прежнему безуспешно

3. Как вы можете быть уверены, что все ваши исходники были успешно загружены. Это асинхронная задача и не имеет ничего общего с вызовом вашего кода в последней строке.

4. извините, я не знал, что это асинхронная задача, и я был уверен, потому что мои слои отлично отображают функции из этого источника. итак, должен ли я использовать getState () или on (‘render’,function())?

5. Прежде всего попробуйте вызвать вашу функцию, как только увидите все векторы на своей карте, просто чтобы убедиться, что это ваша проблема. И тогда да, вам нужно вызвать vectorSource.on('change', function(e) { if (vectorSource.getState() == 'ready') { ...call your method....