我已经通过这个online tutorial来理解Sencha touch的基本概念。现在,我确信我可以期待用我的知识开始为真实项目编码。
但我对本教程中作者使用的this.callParent(arguments)
的功能有疑问。
我知道这个名字清楚地表明这个的“父类被称为”。
但我有类似的问题:(与教程有关)
请帮助我理解与上述教程相关的callParent
。
我经历了touch docs,我无法理解。 (关于作者的代码,解释似乎与我完全不同。)
答案 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.Controller
类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: {
}
});
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
我们知道,当我们启动应用程序init
和launch
时,每个控制器的功能都会被调用一次。
但是,你看到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.Messages
级this.callParent(arguments);
函数中放置loadMessage
后才会被调用。
请注意,Mail.controller.phone.Messages
参数只会传递给item
的{{1}}函数,但loadMessage
的{{1}}函数仍会获得Mail.controller.phone.Messages
争论,如何?
由于loadMessage
您在Mail.controller.phone.Messages
类的item
函数内传递了arguments
函数。