2011-04-30 50 views
0

任何可以告诉我为什么我不断收到一个方法buildItems未在以下代码中定义?我逃避一些重要的东西吗?Extjs通过定义延伸时未定义的方法

Ext.define('MyApp.view.Viewport', { 
extend: 'Ext.container.Viewport', 
requires: [ 
    'Ext.layout.container.Border' 
], 

layout : 'border', 
items : [this.buildItems()], 

buildItems  : function() { 
    return { region:'center',xtype:'panel'} 
} 
}); 

的buildItems方法没有理由成为一个公共的方法,我只是先尝试​​这种方式。这是我现在这样做的方式:

(function() { 
function buildItems() { 
    return [ 
      { 
       region : 'center', 
       xtype : 'panel', 
      }, { 
       region : 'west', 
       xtype : 'panel', 
       width : 225 
      },{ 
       region : 'south', 
       xtype : 'panel', 
       height : 50 
      },{ 
       region : 'north', 
       xtype : 'panel', 
       height : 50 
      } 
    ] 
} 

return Ext.define('MyApp.view.Viewport', { 
    extend: 'Ext.container.Viewport', 
    requires: [ 
     'Ext.layout.container.Border' 
    ], 

    layout : 'border', 
    items : buildItems() 
}); 
})(); 

这是一个过度延伸?

THX

回答

1

的问题是:在生产线

items : [this.buildItems()], 

范围的执行时间是全局对象,即this计算结果为window。 你不应该把items成一类,无论如何,因为实例可以修改item的项目,这样做的正确方法是

initComponent: function() { 
    this.items = this.buildItems(); // now, "this" is the current component instance 
    // superclass.initComponent... 
} 

编辑:作为一个答案的第二部分问题

这已经被讨论了一百万次,并且没有任何错误使这个帮助函数是私有的。我个人倾向于公开方法,因为这会增加代码的可读性。通常我使用doc注释(@private)作为标记,并且很简单,避免调用所谓的私有方法。我认为这不是什么大问题,因为我主要不是为第三方开发人员构建图书馆或任何可重用的东西。

+0

我在我的问题中增加了另一部分,这是隐藏buildItem的又一个好方法,也就是说它是私人的,因为它没有定义public – ken 2011-04-30 08:08:03

0

这是因为函数是在另一个函数定义和视口将在自执行功能以外进行访问。因此,将这个buildItems()放在自执行函数之外并尝试相同。

+0

我删除了问题的第二部分以消除混淆。虽然你的答案没有帮助。 – ken 2011-04-30 07:51:09