2012-05-28 63 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