3

ファイル名を含むスクロール メニューがあります。メニューのファイル名をクリックすると、そのファイル名をタイトルにしたウィンドウを作成したい。

以下のコードでは、ウィンドウを作成できますが、タイトルはありません。

問題は行にあります ( title: jsonobj[ii], // I got undefined here )。

var scrollMenu = Ext.create('Ext.menu.Menu');
var files = Ext.Ajax.request({
  url: 'php/getfiles.php',
  success: function(response, opts) {
    var jsonobj = Ext.decode(response.responseText);
    for(var ii = 0; ii < jsonobj.length; ii++){
      scrollMenu.add({
        text: jsonobj[ii], // working good
        handler: function () {
          var winfile = Ext.create('widget.window', {
            region: 'center',
            height: 500,
            width: 900,
            x: 500,
            y: 100,
            title: jsonobj[ii], // not working
            closable: true,
            plain: true,
            layout: 'fit',
            preventBodyReset: true,
          });
          winfile.show();
        }
      });
    }
  },
  failure: function(response, opts) {
    console.log('somthing went wrong with this AJAX call' + response.status);
  }
});
4

1 に答える 1

2

問題は、すべてのhandlerコールバックが同じクロージャーで定義されていることです。つまり、一度コールバックiiのスコープが変更されると、successすべてのコールバックに自動的に影響しhandlerます。jsonobj[jsonobj.length] === undefinedあなたは常に未定義のタイトルを取得するので。handler以下のような他のクロージャーでラップする必要があります。

handler: (function(){
    var title = jsonobj[ii];
    return function () {
        var winfile = Ext.create('widget.window', {
            region: 'center',
            height: 500,
            width: 900,
            x: 500,
            y: 100,
            title: title,
            closable: true,
            plain: true,
            layout: 'fit',
            preventBodyReset: true
        });
        winfile.show();
    }
}())
于 2013-03-21T14:00:22.053 に答える