1

これは、ここで見つかった問題と同様の問題のようですが、提供されている解決策を理解していないことを残念に思います。 HTML5 の複数のドロップ イベント

Ext JS ライブラリを使用して、1 つのドラッグ ソースから複数のドロップ ターゲットをセットアップしようとしています。notifyEnter のクロージャーを定義すると、常に変数 "i" を使用して警告するように見えます (デバッグ目的で警告するように変更しました)。Javaのバックグラウンドから来た私の直感は、ループ内で最終変数を定義し、クロージャーを定義する前にiまたはplayerLocationPanelのいずれかを割り当てることでこれを解決することですが、それは有効な解決策ではないようです.

これは 8 ~ 10 年ぶりの Javascript への取り組みです。ご協力をお願いいたします。

/****
* Setup Drop Targets
***/
var playerPanelDropTargets = new Array();
var dropTargetEls = new Array();
for(var i=0;i<=5; i++){
    dropTargetEls[i] = playerLocationPanels[i].body.dom;

    playerPanelDropTargets[i] = Ext.create('Ext.dd.DropTarget', dropTargetEls[i], {
        ddGroup: 'GridExample',
        notifyEnter: function(ddSource, e, date){
            // The problem here is that it always calls, specifically playerLocationPanels[i]
            // and i is always going to be 1 more than the top of the loop.
            //playerLocationPanels[i].body.stopAnimation();
            //playerLocationPanels[i].body.highlight();
            alert(i);

        }
    });
}
4

1 に答える 1

0

参照する質問で述べたのと同じ基本的なアプローチを取る必要があります。「notifyEnter」関数は、「i」を渡し、ハンドラー関数を返す別の関数で作成する必要があります。このようなもの:

playerPanelDropTargets[i] = Ext.create('Ext.dd.DropTarget', dropTargetEls[i], {
    ddGroup: 'GridExample',
    notifyEnter: makeHandler(i)
});

// ...

function makeHandler(i) {
  return function(ddSource, e, date){
        alert(i);
        // etc.
    };
}

別の関数を呼び出してハンドラー関数を作成することにより、各ハンドラー関数が "i" の値の独自のコピーを持つようにします。

于 2013-02-15T23:40:34.830 に答える