Javascript OpenLayers 3:stylefunction在缩放/平移后不会为未选择的功能调用

Javascript OpenLayers 3:stylefunction在缩放/平移后不会为未选择的功能调用,javascript,openlayers-3,Javascript,Openlayers 3,我为我的问题准备了一把小提琴: 单击蓝色圆圈选择它->它变为红色 单击另一个蓝色圆圈->原始圆圈变为蓝色(取消选中),新圆圈变为红色(选中) 到目前为止还不错。现在,如果您改为执行以下操作: 单击蓝色圆圈->它变为红色 缩小并返回->它保持红色 单击另一个蓝色圆圈 ->两个圆圈都是红色,而不是取消选择第一个 我所拥有的就是一个selectInteraction,带有styleFunction这样的功能(我做了更多的事情,比如文本和缓存样式,但效果是一样的): 为什么我的“取消选择”样式在缩放或平

我为我的问题准备了一把小提琴:

  • 单击蓝色圆圈选择它->它变为红色
  • 单击另一个蓝色圆圈->原始圆圈变为蓝色(取消选中),新圆圈变为红色(选中)
  • 到目前为止还不错。现在,如果您改为执行以下操作:

  • 单击蓝色圆圈->它变为红色
  • 缩小并返回->它保持红色
  • 单击另一个蓝色圆圈
  • ->两个圆圈都是红色,而不是取消选择第一个

    我所拥有的就是一个
    selectInteraction
    ,带有
    styleFunction
    这样的功能(我做了更多的事情,比如文本和缓存样式,但效果是一样的):

    为什么我的“取消选择”样式在缩放或平移后错误?就我所见,在调试
    styleFunction
    时,选择是正确的(仅包含1项),只是取消选择的项没有正确设置样式

    我使用
    styleFunction
    ,因为无论是否选中,我都会根据附着到特征的对象设置文本和半径。因此,我计算特征的样式,并对选定和取消选定的特征使用相同的
    styleFunction


    编辑:解决方案 我更新了。显然,您必须将所有取消选择的功能的样式设置为“null”(参见Jonatas Walker的回答):


    更新-

    内置
    styleFunction

    var fill_color = (this instanceof ol.Feature) ?
        [0, 0, 255, 1] : [255, 255, 255, 1];
    
    并在“选择侦听器”上设置所选样式:

    selectInteraction.on('select', function(evt){
        var selected = evt.selected;
        var deselected = evt.deselected;
        if (selected.length) {
            selected.forEach(function(feature){
                feature.setStyle(styleFunction);
            });
        }
        if (deselected.length) {
            deselected.forEach(function(feature){
                feature.setStyle(null);
            });
        }
    });
    

    这是因为对
    ol.layer.Vector
    ol.select.Interaction
    使用相同的
    styleFunction


    因此,当你放大/缩小向量层时,它会从你的
    样式函数中读取样式。是的,我使用相同的styleFunction,因为本质上我希望所有内容都相同(计算文本、计算半径等),除了fillcolor。怎么了?如何改进代码?谢谢。我只需要添加您在SelectListener中使用的5行代码,将所有取消选择的特性的样式设置为“null”。虽然我不明白为什么我需要在缩放/平移后手动执行此操作,但如果我不缩放/平移,则不需要手动执行此操作。
    
    var fill_color = (this instanceof ol.Feature) ?
        [0, 0, 255, 1] : [255, 255, 255, 1];
    
    selectInteraction.on('select', function(evt){
        var selected = evt.selected;
        var deselected = evt.deselected;
        if (selected.length) {
            selected.forEach(function(feature){
                feature.setStyle(styleFunction);
            });
        }
        if (deselected.length) {
            deselected.forEach(function(feature){
                feature.setStyle(null);
            });
        }
    });