通过define扩展时Extjs未定义的方法

时间:2011-04-30 06:13:51

标签: javascript extjs

可以告诉我为什么我一直在获取未在以下代码中定义的方法buildItems?我逃避了必不可少的事情吗?

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

2 个答案:

答案 0 :(得分: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)作为标记,并且完全避免调用所谓的私有方法。我认为这不是什么大问题,因为我主要不是为第三方开发人员构建库或任何可重用的东西。

答案 1 :(得分:0)

这是因为该函数在另一个函数中定义,并且视口将在此自执行函数之外访问。因此,将此buildItems()置于自执行函数之外并尝试相同。