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 回答