我为我的问题准备了一个小提琴:Fiddle
- > 两个圆圈都是红色而不是取消选择第一个!
我所拥有的只是一个selectInteraction
,styleFunction
就像这样(我做了更多的事情,比如文字和缓存样式,但效果是一样的):
function styleFunction(feature, resolution) {
var selected = selectInteraction.getFeatures().getArray().indexOf(feature) >= 0;
return [
new ol.style.Style({
image: new ol.style.Circle({
radius: 30,
stroke: new ol.style.Stroke({
color: 'blue',
width: 1
}),
fill: new ol.style.Fill({
color: selected ? [255, 0, 0, 1] : [0, 0, 255, 1]
})
}),
text: new ol.style.Text({
text: 'Test',
fill: new ol.style.Fill({
color: 'black'
})
})
})];
}
为什么缩放或平移后我的“取消选择”-Style出错了?据我所知,在调试styleFunction
时,选择是正确的(只包含1个项目),只是取消选择的项目没有正确设置样式。
我使用styleFunction
因为无论是否选中,我都会根据附加到该要素的对象设置文本和半径。所以我计算了一个特征的样式,并对选定的和未选择的特征使用相同的styleFunction
。
我更新了Fiddle。显然你必须将所有取消选择的特征的样式设置为“null”(参见Jonatas Walker的答案):
selectInteraction.on('select', function (evt) {
if (evt) {
$.each(evt.deselected, function (idx, feature) {
feature.setStyle(null);
});
}
});
答案 0 :(得分:0)
更新 - http://jsfiddle.net/jonataswalker/4vu669Lq/
内部styleFunction
var fill_color = (this instanceof ol.Feature) ?
[0, 0, 255, 1] : [255, 255, 255, 1];
并在select listener上设置所选样式:
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);
});
}
});
这是因为您对styleFunction
和ol.layer.Vector
使用相同的ol.select.Interaction
。
因此,当您放大/缩小矢量图层时,会从styleFunction
中读取样式。