0

マーカーを 2 秒ごとに更新するマップがあります。特定のマーカーで「何か」が間違っているというサードパーティのライブラリを使用して、トースト メッセージを表示します。トーストをクリックすると、マップが中央に配置され、特定のマーカーにズームインされます。

単一のマーカーではすべて正常に機能しますが、複数のトーストがあると、最終的に最後のマーカー (「何か」がうまくいかなかった場所) が表示されます。これは js クロージャとスコープに関連する問題であることは理解していますが、解決方法がわかりません。

if(/*something is wrong at marker*/) {
    if(toastShown.indexOf(i) == (-1))   // check if toast has been shown
    {
        toastShown.push(i);     // mark toast for current marker as shown
        var err = "Problem detected! Click to go to location";
        toastr.error(err, 'Error!', {timeOut: 10000});
        problemAtPoint.push(point);
        index++;
    }       
}

for( var j = 0; j < index; j++) {
    toastr.options.onclick = (function() {
        return function() {
            //alert('clicked!');
            map.setCenter(problemAtPoint[index]);
            map.setZoom(15);  
        }
    })(problemAtPoint[index]);
}
4

1 に答える 1

0

Javascript クロージャーとは何かを検討する必要があります。これを見てください https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures

このjsfiddle は、ループを使用した例を示しています

function setupHelp() {
    var helpText = [
        {'id': 'email', 'help': 'Your e-mail address'},
        {'id': 'name', 'help': 'Your full name'},
        {'id': 'age', 'help': 'Your age (you must be over 16)'}
    ];

    for (var i = 0; i < helpText.length; i++) {
        var item = helpText[i];
        document.getElementById(item.id).onfocus = makeHelpCallback(item.help);
    }
}

あなたの問題は、閉鎖パラメータを使用していないようです

toastr.options.onclick = 
    (function(ITEM) {
       return function() {
           //alert('clicked!');
           map.setCenter(ITEM);
           map.setZoom(15);  
       }
})(problemAtPoint[index]);
于 2014-06-22T07:38:54.927 に答える