2013-08-01 38 views
4

我已經通過這個online tutorial瞭解了Sencha touch的基本概念。現在,我相信我可以期待着用我的知識開始編寫真實的項目。callParent的用法是什麼

但是我對本教程中作者使用的this.callParent(arguments)的功能有疑問。

我知道這個名字清楚地表明「父類這個被稱爲」
但我有這樣的問題:(相關教程

  • 爲什麼我們調用父類?
  • 這會再次完全運行父類嗎?

請幫我理解callParent與上面的教程有關。

我已經通過了我無法理解的touch docs。 (關於作者的代碼,解釋看起來完全不同)。

Project download link

回答

18

正如你在你的問題this.callParent(arguments)調用父類相應的功能提及。

即在構造函數中調用this.callParent(arguments)調用正在擴展的超類的構造函數。

在你提到的教程中,這是作者所做的。

launch: function() { 
    //This line simply calls the super class(Ext.app.Controller) launch function 
    this.callParent(arguments); 
    var notesStore = Ext.getStore("Notes"); 
    notesStore.load(); 
    console.log("launch"); 
}, 

init: function() { 
    // This line simply calls the super class(Ext.app.Controller) init function 
    this.callParent(arguments); 
    console.log("init"); 
} 

但他爲什麼這樣做,我不知道,因爲沒有必要調用Ext.app.Controllerinitlaunch功能在該教程。

讓我用例子來解釋

1)創建一個名爲Main

Ext.define('MyApp.controller.Main', { 
    extend: 'Ext.app.Controller', 

    launch: function() { 
     console.log("Main launch"); 
    },  

    init: function() { 
     console.log("Main init"); 
    },  

    config: { 

    } 
}); 

2)超類中創建子類SubMain當你運行你的應用程序,擴展MyApp.controller.Main

Ext.define('MyApp.controller.SubMain', { 
    extend: 'MyApp.controller.Main', 

    launch: function() { 
     this.callParent(arguments); 
     console.log("launch"); 
    }, 

    init: function() { 
     this.callParent(arguments); 
     console.log("init"); 
    }, 

    config: { 
    } 
}); 

現在,我們把console.log放在了super和subclass中在瀏覽器控制檯L打印以下

輸出

Main init 
Main init 
SubMain init 
Main launch 
Main launch 
SubMain launch 

正如我們知道,當我們啓動應用程序init和每個控制器的launch功能將被調用一次。

但是,你看到Main init &主要啓動函數被調用兩次,爲什麼?

這就是所謂的超類的init和發射功能的原因又是因爲我們在SubMaininit and launch功能放置this.callParent(arguments);,即再次呼籲Main(超類)類的init和發射功能。

還有更多,怎麼樣argumentscallParent功能

arguments傳遞是一個特殊的參數。

現在,讓我們舉個例子來測試

Ext.define('Mail.controller.Messages', { 
    extend: 'Ext.app.Controller', 

    config: { 
     refs: { 
      viewer: 'messageviewer', 
      messageList: 'messagelist' 
     }, 
     control: { 
      messageList: { 
       itemtap: 'loadMessage' 
      } 
     } 
    }, 

    loadMessage: function(item) { 
     this.getViewer().load(item); 
    } 
}); 

Mail.controller.phone.Messages類擴展Mail.controller.Messages,這僅僅意味着所有的配置和功能都繼承。現在

Ext.define('Mail.controller.phone.Messages', { 
    extend: 'Mail.controller.Messages', 

    config: { 
     refs: { 
      main: '#mainPanel' 
     } 
    }, 

    loadMessage: function(item) { 
     // Without this line loadMessage function of super class will not be invoked 
     this.callParent(arguments); 
     this.getMain().setActiveItem(1); 
    } 
}); 

messageList上項目的用戶選項卡中Mail.controller.phone.MessagesloadMessage功能將被調用。

此外,我們放置在this.callParent(arguments);功能loadMessage,所以首先Mail.controller.MessagesloadMessage功能將被調用,然後this.getMain().setActiveItem(1);線運行。

如前所述loadMessage功能Mail.controller.Messages,直到你把this.callParent(arguments);loadMessage功能在Mail.controller.phone.Messages類將不會被調用。

注意item說法只會傳遞給的Mail.controller.phone.MessagesloadMessage功能,但Mail.controller.phone.MessagesloadMessage功能仍然得到了item說法,如何?

這是因爲arguments你通過了this.callParent函數loadMessage函數Mail.controller.phone.Messages類。