callParent有什么用?

时间:2013-08-01 11:11:16

标签: sencha-touch sencha-touch-2 sencha-touch-2.1

我已经通过这个online tutorial来理解Sencha touch的基本概念。现在,我确信我可以期待用我的知识开始为真实项目编码。

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

我知道这个名字清楚地表明这个“父类被称为”
但我有类似的问题:(与教程有关

  • 为什么我们要打电话给父班?
  • 这会完全再次运行父类吗?

请帮助我理解与上述教程相关的callParent

我经历了touch docs,我无法理解。 (关于作者的代码,解释似乎与我完全不同。)

Project download link

1 个答案:

答案 0 :(得分: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将在浏览器控制台中打印以下内容

<强>输出

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

我们知道,当我们启动应用程序initlaunch时,每个控制器的功能都会被调用一次。

但是,你看到Main init&amp;主要启动功能被调用两次,为什么?

再次调用超类的init和启动函数的原因是因为我们将this.callParent(arguments);放在init and launch的{​​{1}}函数中,即调用{{1}的init和启动函数再次。(超类)类。

还有更多内容,SubMain函数传递的Main怎么样

arguments是一个特殊参数。

现在,让我们举一个例子来测试

arguments

callParent类扩展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函数。

我们还将loadMessage置于Mail.controller.phone.Messages函数,因此将调用第一个this.callParent(arguments);loadMessage函数,然后Mail.controller.Messages行将运行。

如前所述,loadMessage中的this.getMain().setActiveItem(1);功能只有在loadMessage Mail.controller.Messagesthis.callParent(arguments);函数中放置loadMessage后才会被调用。

请注意,Mail.controller.phone.Messages参数只会传递给item的{​​{1}}函数,但loadMessage的{​​{1}}函数仍会获得Mail.controller.phone.Messages争论,如何?

由于loadMessage您在Mail.controller.phone.Messages类的item函数内传递了arguments函数。