Suprascrieți funcția într-o buclă pentru

Dezvolt o aplicație OpenLayers care face o clasificare dinamică a unui strat vectorial. Prin urmare, încerc să introduc un anumit număr de clase tematice (categorii) și să definim un filtru pentru fiecare clasă din interior.

Un obiect OpenLayers numit OpenLayers.Filter.Function reprezintă fiecare dintre filtre. Fiecare OpenLayers.Filter.Function suprascrie funcția evaluate() a clasei OpenLayers.

Codul meu arată astfel:

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

Din păcate, acest lucru nu funcționează. Se pare că toate filtrele execută funcția evaluate() - a ultimului ciclu de buclă.

Ai vreo idee?

0
Vă mulțumim pentru observația dvs., bineînțeles că aveți dreptate. Am fost puțin confuz în timpul experimentării cu codul. ;)
adăugat autor rjw, sursa
Indiferent de problema dvs., rețineți că orice cod de sub declarația return nu va fi executat.
adăugat autor inhan, sursa

1 răspunsuri

Faceți o închidere peste i , care este mutable , adică pentru toate regulile dvs., valoarea i va fi aceeași în final, și anume, numClasses - 1 . i este aceeași variabilă, partajată pentru toate iterațiile. Nu este creată nicio copie în interiorul corpului bucla.

Iată modul potrivit de a face acest lucru:

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

În versiunile viitoare ale Javascript, veți putea face let j = i în for loop-ul, dar de acum încolo sunteți blocați cu aceste semantici.

0
adăugat
Vă mulțumim pentru soluția perfectă!
adăugat autor rjw, sursa
JavaScript, România - Moldova
JavaScript, România - Moldova
328 participanți

Comunitatea Română JavaScript: github.com/js-ro Pentru confort, opriți notificările. Parteneri: @node_ro, @php_ro, @python_ro, @seo_ro, @RomaniaGroup, @ai_ro, @Grupuri_IT Offtop: @holywars_ro Joburi: @js_jobs_ro Sponsored with ❤️ by ciupacabra.com