2012-02-13 4 views
1

Я пытаюсь выяснить, почему callParent не работает.ExtJS 4 callParent не работает

Вот код:

Ext.define('AM.ArView', { 
extend:'Ext.window.Window', 
initComponent: function() { 
    var foo = this; 
    console.log(foo); 

    Ext.Ajax.request({ 
     url: 'http://my/awesome/path', 
     success: function(response, opts) { 
      console.log(foo); 
      foo.callParent(); 
     }, 
     failure: function(response, opts) { 
      console.log('error'); 
     } 
    }); 
} 
}); 

Ошибка: Uncaught TypeError: Не удается прочитать свойство 'суперкласс' неопределенной

мне нужно, чтобы загрузить элементы окна с помощью AJAX

+1

во всяком случае, решение делает синхронный вызов. –

+0

Перехват initComponent таким образом .. очень странно. Я бы рекомендовал использовать для этого специальное мероприятие. – knalli

+0

это не странно, и асинхронный вызов возможен и очень разумен, см. Мой ответ ниже, пожалуйста. – Tom

ответ

0

Hei Джулиан!

Мне нужно было выполнить аналогичную операцию, и я закончил wrappign ajax-запрос в функции, в которой я передаю функцию обратного вызова в нее для выполнения, когда запрос выполняется, и из обратного вызова я запускаю окна.

С точки зрения кода, было бы что-то вроде:

//Request function 
LoadThoseDamnWindows: function (callback) 
    { 
     Ext.Ajax.request({ 
      url: 'checklist/GetList', 
      success: function(response, opts) { 
       console.log(response); 
       callback.call(this, response); 
      }, 
      failure: function(response, opts) { 
       console.log('error'); 
      } 
     }); 
    } 

тогда вы звоните INT позволяет, скажем оны нажатие кнопки:

 { 
       xtype: 'button', 
       text: 'Help', 
       iconCls: 'help', 
        scope: this, 
       handler: function(){ 
        //Call function 
        this.LoadThoseDamnWindows(function(loadedData){ 

         Ext.create('Ext.window.Window',{ 
          autoShow: true, 
          layout: 'fit', 
          title: "My Cool window", 
          html: "My window content with dynamic loaded data" + loadedData.responseText 
         }); 

        }); 
       } 
      } 

НТН!

2

Мне нужно было пройти обратный вызов с callParent в Ext.Msg.* диалог. Честно говоря, я не понимал, как использовать код из ответа для моего случая ... и решил его с помощью взлома.

Работа в 4.0.7:

methodName: function() { 
    var me = this, 
     args = arguments; 
    // do some stuff 
    function customCallback() { 
     // do some stuff inside callback 
     // hacks for calling parent method from callback 
     var caller = arguments.callee.caller; 
     caller.$owner = me; 
     caller.$name = 'methodName'; 
     me.callParent(args); 
    } 
    // do more stuff, pass callback anywhere 
} 
+0

человек, которого вы спасли мою жизнь с этим ответом, спасибо! –

1

Немного поздно, но надеюсь, что это помогает другим ...

Вместо вызова this.callParent();

Вам нужно позвонить this.self.superclass.foo.call(this);

foo - метод суперкласса, который вы хотите вызвать.

Чтобы обернуть его и сделать его более meanful:

callParentManually: function (myscope, methodname) { 
    myscope.self.superclass[methodname].call(myscope); 
} 

//and then ... 
callParentManually(me, 'initComponent'); 

Смотреть это:

ExtJS 4 - async callback to callParent throws exception

Смежные вопросы