2013-07-10 38 views
0

我試圖從組件初始化中訪問函數。 Sencha Touch/Ext.js新手,因此不確定範圍如何工作。我在'控制'中'旋轉'了聽衆,聽起來似乎很有效,但增加了。Sencha在父視圖中觸摸訪問方法

簡化代碼:

Ext.define('App.view.CreateChallenge', { 
    extend: 'Ext.Container', 
    fullscreen: true, 
    xtype: 'CreateChallenge', 
    config:{ 
     items[ 
      xtype: 'spinnerfield', 
      itemId: 'mySpin', 
      initialize:function(){ 
       App.view.Challenge.doThis(); 
      } 
     ], 
    control:{ 
     '#mySpin' : { 
      spin: 'doThis' 

     } 
    } 
    }, 
    doThis:function(){ 
     console.log('dooing this'); 
    } 
}); 

謝謝你,史蒂夫

回答

2

首先,你不應該在配置塊覆蓋initialize方法,對於正確的地方是在Ext.define

然後,在initialize中,您可以撥打App.view.CreateChallenge.doThis()。但它只是一個普通的函數,其範圍是全局的window對象,所以你無法訪問App.view.CreateChallenge的對象。

要從子項中查找容器參考,可以使用Ext.Component.up()。在你的情況下,它會看起來像:

initialize: function() { 
    … 
    this.up('CreateChallenge').doThis(); // find container by xtype then call its method 
} 

我們還沒有呢!如果您嘗試,您將從this.up(…)獲得undefined。這是因爲容器在其子進行初始化時尚未完成構建。因此,如果您需要initialize方法中的容器參考,則需要等待容器準備好,例如painted事件。

然後,你最終將事情是這樣的:

initialize: function() { 
    … 
    this.on('painted', function() { 
     this.up('CreateChallenge').doThis(); // find container by xtype then call its method 
    }, this); 
} 
+0

感謝@Ye劉。感謝關於重寫初始化的提示。我一直試圖理解代表,控制者,參考並且一直在暈頭轉向嘗試處理它。上畫真的很有幫助,因爲我得到沒有發現錯誤。 – daxiang28

0

我會簡單地使用

VIEW/This .getParent() 
+0

謝謝@Fawar。我開始意識到有兩種類型的ext/sencha遍歷:dom和component。 – daxiang28

+0

沒問題。糾正我,如果我錯了,你試圖實現DOM元素父母,而不是組件父母是它嗎? – Fawar

+0

組件父...但現在我知道兩個。 – daxiang28