我正在开发一个OpenLayers应用程序,它对矢量图层进行动态分类。因此,我试图遍历特定数量的专题类(类别),并为内部的每个类定义一个过滤器。
名为 OpenLayers.Filter.Function 的OpenLayers对象表示每个过滤器。每个OpenLayers.Filter.Function都会覆盖OpenLayers类的evaluate()函数。
我的代码如下所示:
var rules = new Array();
for (var i = 0; i < numClasses; i++) {
filter_x = function() {
return new OpenLayers.Filter.Function({
evaluate: function(attributes) {
// some code to define the filter
// uses specific values: array[i] & array[i+1
}
var rule_x = new OpenLayers.Rule({
filter: filter_x,
symbolizer: { fillColor: colors[i],
fillOpacity: 0.5, strokeColor: "white"}
});
rules.push(rule_x);
}
thematicStyle.addRules(rules);
不幸的是,这不起作用。似乎所有过滤器都执行上一个循环周期的evaluate()函数。
你有什么想法吗?
答案 0 :(得分:1)
您正在i
关闭可变,即对于您的所有规则,i
的值将相同最后,即numClasses - 1
。 i
是相同的变量,为所有迭代共享。循环体内没有创建副本。
这是正确的方法:
var rules = new Array();
for (var i = 0; i < numClasses; i++) (function (i) {
filter_x = function() {
return new OpenLayers.Filter.Function({
evaluate: function(attributes) {
// some code to define the filter
// uses specific values: array[i] & array[i+1
}
var rule_x = new OpenLayers.Rule({
filter: filter_x,
symbolizer: { fillColor: colors[i],
fillOpacity: 0.5, strokeColor: "white"}
});
rules.push(rule_x);
})(i);
thematicStyle.addRules(rules);
在Javascript的未来版本中,您可以在for循环中执行let j = i
,但就目前而言,您仍然坚持使用这些语义。