Sencha touch callParent有什么用

Sencha touch callParent有什么用,sencha-touch,sencha-touch-2,sencha-touch-2.1,Sencha Touch,Sencha Touch 2,Sencha Touch 2.1,我通过这些来理解Sencha touch的基本概念。现在,我确信我可以用我的知识开始为真正的项目编码 但是我对作者在教程中使用的this.callParent(arguments)的功能有一个疑问 我知道这个名字清楚地表明它的父类被称为“”。 但我有如下问题:(与教程相关) 为什么我们要调用父类 这会再次完全运行父类吗 请帮助我理解与上述教程相关的callParent 我经历了一些我不明白的事情。(对于作者的代码,我的解释似乎完全不同) 正如您在问题中提到的,this.callParent(

我通过这些来理解Sencha touch的基本概念。现在,我确信我可以用我的知识开始为真正的项目编码

但是我对作者在教程中使用的
this.callParent(arguments)
的功能有一个疑问

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

  • 为什么我们要调用父类
  • 这会再次完全运行父类吗
请帮助我理解与上述教程相关的
callParent

我经历了一些我不明白的事情。(对于作者的代码,我的解释似乎完全不同)


正如您在问题
中提到的,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.Controller
class
init
launch
函数

让我举例说明一下

1) 创建名为
Main

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

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

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

    config: {

    } 
});
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: {
    }
});
2) 创建子类
submin
,该子类扩展了
MyApp.controller.Main

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

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

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

    config: {

    } 
});
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: {
    }
});
现在,当您运行应用程序时,我们在super和subclass中放置的console.log将在浏览器控制台中打印以下内容

输出

Main init 
Main init 
SubMain init 
Main launch 
Main launch
SubMain launch 
我们知道,当我们启动应用程序
init
launch
时,每个控制器的函数都会被调用一次

但是,您会看到Main init和Main launch函数被调用了两次,为什么


它之所以再次被称为超类的init和launch函数,是因为我们放置了
this.callParent(参数)submin
init and launch
函数中,再次调用
Main
(超级类)类的init and launch函数

还有更多,传入
callParent
函数的
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.Messages
类中的
loadMessage
函数将被调用

我们还放置了
this.callParent(参数)
at
loadMessage
函数,因此首先调用
Mail.controller.Messages
class
loadMessage
函数,然后调用
this.getMain().setActiveItem(1)行将运行

如前所述,
Mail.controller.Messages中的
loadMessage
函数在放置
this.callParent(参数)之前不会被调用
loadMessage
功能中的
Mail.controller.phone.Messages

请注意,
item
参数将只传递给
Mail.controller.phone.Messages
函数的
loadMessage
,但是
Mail.controller.phone.Messages
函数的
item
参数仍会获得,如何获得


这是因为您在
Mail.controller.phone.Messages
类的
loadMessage
函数中传入了
arguments
这个.callParent
函数。

“之所以再次调用超类的init和launch函数,是因为我们放置了这个.callParent(arguments);在submin的init和launch函数中,即再次调用Main(super class)类的init和launch函数。”您想简单解释一下,但没有解释为什么要调用两次。这是一种原始行为吗?默认情况下,总是在孩子的init之前调用父项的init(和launch)?即使开发人员未指定此类行为?