2013-08-01 1 views
4

Я прошел через это online tutorial, чтобы понять основные понятия Сенча. Теперь я уверен, что могу с нетерпением ждать начала кодирования реального проекта с моими знаниями.Что такое 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.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); 
    } 
}); 

Теперь, когда вкладки пользователя на элемент в messageListloadMessage функция 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 класса.