вызов функции родительского класса в extjs 3 - PullRequest
2 голосов
/ 06 ноября 2011

у меня есть такой extjs класс для Add:

    Ext.ns('Example');

Example.Form = Ext.extend(Ext.form.FormPanel, {

   ,initComponent:function() {
        // hard coded - cannot be changed from outsid
        var config = {
            items: [{
            xtype: 'textfield',
            fieldLabel: 'title',
            name: 'author',
            allowBlank: false
          }

         .........................

    ]
            ,buttons:[
                {
                    text:'submit'
                    ,formBind:true
                    ,scope:this
                    ,handler:this.submit
            }]
        }; // eo config object

        // apply config
        Ext.apply(this, Ext.apply(this.initialConfig, config));

        // call parent
        Example.Form.superclass.initComponent.apply(this, arguments);
    } // eo function initComponent
    /**
    * Form onRender override
    */
    ,onRender:function() {
        ..................
    } // eo function onRender
    /**
    * Reset
    */
   ,reset:function() {
        this.getForm().reset();
    } // eo function onRender
    /**
    * Load button click handler
    */
    ,onLoadClick:function() {
       ....................
    } 

    ,submit:function() {
        ........................
    } 

    ,onSuccess:function(form, action) {
       ..........................
    } 


    ,onFailure:function(form, action) {
           ......................          
    } // eo function onFailure

    ,showError:function(msg, title) {
         ........................
        });
    } 
}); 

и у меня есть другое расширение для редактирования:

Example.Form2 = Ext.extend(Example.Form, {

    ......
 });

как я могу вызвать функцию "onLoadClick" из первого класса во втором классе? Потому что я хочу загрузить данные в мою форму перед загрузкой формы.

Ответы [ 2 ]

7 голосов
/ 28 ноября 2012

Если у вас есть один класс, который расширяет другой класс, вы можете вызывать «родительские» методы класса, используя свойство суперкласса в определении класса.

В приведенном ниже примере мы добавляем специальную функцию mySpecial add и вызываем функцию добавления родительских классов.

Ext.ux.myForm = Ext.extend(Ext.form.FormPanel, {
   ...
   mySpecialAdd: function(comp, anExtraParam) {
     // some special handling here
     ...
     // call parent class add
     return Ext.ux.myForm.superclass.add.call(this, comp);
   }
})

вместо звонка вы также можете выбрать применить

Ext.ux.myForm = Ext.extend(Ext.form.FormPanel, {
   ...
   mySpecialAdd: function(comp, anExtraParam) {
     // some special handling here
     ...
     // call parent class add
     return Ext.ux.myForm.superclass.add.apply(this, [comp]);
   }
})

Обратите внимание, что "this" все равно будет вашим новым классом, поэтому любая другая перезаписанная вами функция будет вызываться из родительского класса, а не из функции родительского класса.

Пример Ext.form.FormPanel имеет метод onAdd, который вызывается в Ext.form.FormPanel.add, поэтому если вы перезаписываете onAdd, то вызывается ваша функция.

Ext.ux.myForm = Ext.extend(Ext.form.FormPanel, {
   ...
   mySpecialAdd: function(comp, anExtraParam) {
     // some special handling here
     ...
     // call parent class add
     return Ext.ux.myForm.superclass.add.apply(this, [comp]);
   },
   // even though onAdd is marked as private you are actually still overwriting it here
   // because of the way its implemented in Ext 3
   onAdd: function(c) {
      // this will get called from the parent class (Ext.form.FormPanel) add method.
      ...

      // so make sure you handle it nicely
      Ext.ux.myForm.superclass.onAdd.call(this, c);

      ...
   }
})
2 голосов
/ 07 ноября 2011

Если вам нужно вызвать метод суперкласса для метода подкласса, вы можете сделать что-то вроде этого:

Example.Form2 = Ext.extend(Example.Form, {

    testMethod: function(){
       ...
       //call parent class method
       Example.Form2.superclass.doLoadClick.call(this);
       ...
    }
 });

Это то, что вы имеете в виду?

...