Как вы упомянули в своем вопросе 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 мы поместили в супер и подкласс wil л печати следующие в консоли браузера
Выход
Main init
Main init
SubMain init
Main launch
Main launch
SubMain launch
Как мы знаем, что, когда мы запускаем приложение init
и launch
функция каждого контроллера будет вызываться один раз.
Но вы видите Main init & Основная функция запуска называется дважды, Why?
Причина это называется инициализации и запуска функции суперкласса снова из-за мы поместили this.callParent(arguments);
в init and launch
функции SubMain
, что звонит инициализации и запуска функции Main
(супер класс) класс еще раз.
Существует еще, как насчет arguments
, который проходил в 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
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
аргумент будет принят только в loadMessage
функции Mail.controller.phone.Messages
, но loadMessage
функция Mail.controller.phone.Messages
еще получает item
аргумент, как?
Это Из-за arguments
вы прошли в this.callParent
функции в loadMessage
функции Mail.controller.phone.Messages
класса.