2011-04-30 71 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