1

我正在开发一个对矢量图层进行动态分类的 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);

不幸的是,这不起作用。似乎所有过滤器都执行最后一个循环周期的评估()函数。

你有什么想法?

4

1 回答 1

1

您正在执行一个可变i的闭包,也就是说,对于您的所有规则,最终的值将是相同的,即. 是同一个变量,为所有迭代共享。在循环体内不会创建任何副本。inumClasses - 1i

这是正确的方法:

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 的未来版本中,您将能够let j = i在 for 循环中执行操作,但现在,您仍受制于这些语义。

于 2012-05-28T16:43:14.423 回答