第二次无法设置WFS过滤器

时间:2015-11-02 19:51:53

标签: javascript openlayers-3

这是我的情景。页面加载,地图加载空矢量图层。所以它在那里,但没有任何功能。然后,用户单击一个按钮,CQL过滤器根据CQL设置加载功能。

我实施此方法的方法。我设置了一个空的矢量图层,没有loaderstrategy。用户第一次点击的按钮调用"初始化"函数(= firstTimeOnly()):

  • 为矢量图层设置loaderstrategy

  • 现在存在loader,调用另一个"过滤"功能(= changeFilter())即 重置加载器的cql过滤器并加载功能

  • 现在"过滤"函数附加到按钮并调用
    随着每一次点击。 "初始化"功能服务于其目的
    并从按钮上脱离。

这是我的代码

<button id= "magicButton", onclick="firstTimeOnly()">Click me</button>

//set globals to use them
var cqlFilter = "name='testpoint9'";
var urlTemplate =  'http://localhost:5550/geoserver/mymap/wfs?service=WFS&version=1.0.0&request=GetFeature&typeName=mymap:layerName&CQL_FILTER={{CQLFILTER}}&outputFormat=application/json';
var loader = function (extent) {
        var url = urlTemplate.replace('{{CQLFILTER}}', cqlFilter);
        $.ajax(url, {
            type: 'GET',
            success: function(response) {
                var res = response;
                var geojsonFormat = new ol.format.GeoJSON();
                sourceVector.addFeatures(geojsonFormat.readFeatures(response));
            }
        })
    };

var strategy = new ol.loadingstrategy.tile(ol.tilegrid.createXYZ({maxZoom: 20}));

//empty vector source
var sourceVector = new ol.source.Vector({});

function changeFilter() {
    //remove all, set cql and reload
    var featsToRemove = layerVector.getSource().getFeatures();
    for (var f=0;f<featsToRemove.length;f++)
    {
        layerVector.getSource().removeFeature(featsToRemove[f]);
    }
    cqlFilter = "name LIKE 'p'";
    sourceVector.clear(true);
}

layerVector = new ol.layer.Vector({
    source: sourceVector,
    style:styleFunction
});

function firstTimeOnly() {
    sourceVector.set('loader', loader);
    sourceVector.set('strategy', strategy);
    changeFilter();
    document.getElementById("magicButton").removeEventListener("click", firstTimeOnly, false);
    document.getElementById("magicButton").addEventListener("click", changeFilter, false);
}

这是基于erilem's code的cql过滤器重置,如果我只使用他的代码工作正常。但是如果我想从一个空层开始并按上面的方式编辑它,我什么也得不到。我的代码没有错误。但是,如果我点击按钮,我什么也得不到。

请告诉我如何解决这个问题。或者它可能是一种矫枉过正,你会建议更聪明的东西。

由于

更新

如果我把

console.log("loader "+sourceVector.get('loader'));

在changeFilter的末尾我得到了loader函数。所以,我想我第一次点击按钮时,firstTimeOnly实际上设置了一个加载器并调用了changeFilter。所以,装载机在那里,但不起作用?有什么帮助吗?

1 个答案:

答案 0 :(得分:2)

在没有涉及Openlayers的潜在问题的情况下,我看到的问题是removeEventListener仅适用于删除使用addEventListener设置的侦听器。由于您在HTML中以声明方式绑定onclick,因此可以通过document.getElementById("magicButton").onclick = null来取消绑定。

那就是说我会改变你的例子,以便在代码中的某个地方使用addEventListener设置事件监听器。

示例:

function firstTimeOnly() {
    sourceVector.set('loader', loader);
    sourceVector.set('strategy', strategy);
    changeFilter();
    document.getElementById("magicButton").removeEventListener("click", firstTimeOnly, false);
    document.getElementById("magicButton").addEventListener("click", changeFilter, false);
}
document.getElementById("magicButton").addEventListener("click", firstTimeOnly, false);

摆脱HTML中的onclick

另请考虑缓存对magicButton的引用,以便您不必经常致电getElementById

var magicButton = document.getElementById("magicButton");