2012-05-28 64 views
1

我正在开发一个可以对矢量图层进行动态分类的OpenLayers应用程序。因此,我试图循环访问特定数量的专题类(类别)并为每个类定义一个过滤器。在for循环中覆盖函数

一个名为的OpenLayers对象OpenLayers.Filter.Function表示每个过滤器。每个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

无论你的问题是什么,都不会执行'return'语句下的任何代码。 – inhan

+0

感谢您的通知,当然你是对的。在对代码进行实验时,我有点困惑。 ;) – rjw

回答

1

你正在做一个封闭在i这是可变,即对所有的规则,i值将是相同的目的,即numClasses - 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循环,但现在,你坚持这些语义。

+0

谢谢你的完美解决方案! – rjw