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);

残念ながら、これは機能しません。すべてのフィルターが、最後のループ サイクルの evaluate() 関数を実行しているようです。

あなたはなにか考えはありますか?

4

1 に答える 1

1

iwhich is mutableに対してクロージャーを実行しています。つまり、すべてのルールについて、 の値は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);

let j = iJavascript の将来のバージョンでは、for ループ内で実行できるようになりますが、現時点では、これらのセマンティクスにとらわれています。

于 2012-05-28T16:43:14.423 に答える