2012-02-13 13 views
1

私はcallParentが動作しない理由を理解しようとしています。ExtJS 4 callParent not working

はここにいくつかのコードです:

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'); 
     } 
    }); 
} 
}); 

エラー: キャッチされない例外TypeError:私はアヤックス

+1

とにかく、解決策は、同期呼び出しを行っています。 –

+0

このようにinitComponentをインターセプトするのは非常に奇妙です。私はこれのために特別なイベントを使用することをお勧めします。 – knalli

+0

それはまったく変わっていないし、非同期呼び出しが可能で非常に合理的です、私の答えをご覧ください。 – Tom

答えて

0

ヘイジュリアン経由でWindows項目をロードする必要が

未定義

のプロパティ 'スーパークラス' を読み取ることができません!

私は同様の操作を行う必要があり、リクエストが完了したときにコールバック関数を渡し、コールバック関数を使ってウィンドウを起動する関数でajaxリクエストをwrappignしました。

//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 
         }); 

        }); 
       } 
      } 

HTH!

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.self.superclass.foo.call(this);

を呼び出す必要がthis.callParent();

を呼び出します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